R交叉仅查找正值或负值tidyverse

R交叉仅查找正值或负值tidyverse,r,dplyr,across,R,Dplyr,Across,在dplyr中有以下示例: df <- tibble(x = c("a", "b"), y = c(1, 1), z = c(-1, 1)) # Find all rows where EVERY numeric variable is greater than zero df %>% filter(across(where(is.numeric), ~ .x > 0)) #> # A tibble: 1 x 3 #> x

在dplyr中有以下示例:

df <- tibble(x = c("a", "b"), y = c(1, 1), z = c(-1, 1))
# Find all rows where EVERY numeric variable is greater than zero
df %>% filter(across(where(is.numeric), ~ .x > 0))
#> # A tibble: 1 x 3
#>   x         y     z
#>   <chr> <dbl> <dbl>
#> 1 b         1     1

我认为,由于您在一个行操作中处理2个变量,因此使用
purr
包中的
map2
会容易得多:

library(dplyr)
library(purrr)

df <- tibble(x = c("a", "b", "c"), y = c(1, 1, -1), z = c(-1, 1, -1))

df %>%
  filter(map2_lgl(y, z, ~ (.x > 0 & .y > 0) | (.x < 0 & .y < 0)))

# A tibble: 2 x 3
  x         y     z
  <chr> <dbl> <dbl>
1 b         1     1
2 c        -1    -1

库(dplyr)
图书馆(purrr)
df%
过滤器(map2_lgl(y,z,~(.x>0&.y>0)|(.x<0&.y<0)))
#一个tibble:2x3
x y z
1b11
2c-1-1

我们必须从一组条件中检查所有
TRUE
或所有
FALSE
,如
c(T,T)
c(T,F)
c(F,F)
。现在-

  • if\u all
    将过滤
    c(T,T)
  • !如果有任何
    将再次从
    中过滤
    c(T,T)
    即剩余值的求反
  • 这两者将通过一个
    |
    连接,即或
  • 因此,我们只有
    c(T,T)
    &
    c(F,F)
这样就可以了

df %>% filter(if_all(where(is.numeric), ~ .x > 0) | !if_any(where(is.numeric), ~ .x < 0))

# A tibble: 2 x 3
  x         y     z
  <chr> <dbl> <dbl>
1 b         1     1
2 c        -1    -1
df%>%过滤器(如果全部(其中(是数值的),~.x>0)|!如果有(其中(是数值的),~.x<0))
#一个tibble:2x3
x y z
1b11
2c-1-1
另类

df %>% filter(if_all(where(is.numeric), ~ .x > 0) | across(where(is.numeric), ~ .x < 0))

# A tibble: 2 x 3
  x         y     z
  <chr> <dbl> <dbl>
1 b         1     1
2 c        -1    -1
df%>%过滤器(如果_all(其中为数值),~.x>0)|跨越(其中为数值),~.x<0))
#一个tibble:2x3
x y z
1b11
2c-1-1
让我们看看更大的例子

set.seed(201)
df <- data.frame(A = LETTERS[1:10], x = rnorm(10), y = rnorm(10), z = -1*rnorm(10))

> df
   A           x           y           z
1  A  0.28606069  0.69329617  0.24400084
2  B -0.34454603  0.22380936  0.98825314
3  C  0.32576373  0.39845694 -1.24206048
4  D -1.69658097  1.01347438  1.68266603
5  E -1.28548252 -0.64785307 -1.44289063
6  F -0.07503189  0.64845271  0.46543975
7  G  0.26693735  0.20734270 -0.69366150
8  H  0.05593404  0.06439014  0.08772557
9  I -2.30403431  0.66938092  0.95508038
10 J  0.18900414 -0.37425445 -0.17010088

> df %>% filter(if_all(where(is.numeric), ~ .x > 0) | !if_any(where(is.numeric), ~ .x < 0))
  A           x           y           z
1 A  0.28606069  0.69329617  0.24400084
2 E -1.28548252 -0.64785307 -1.44289063
3 H  0.05593404  0.06439014  0.08772557
set.seed(201)
df-df
A x y z
1 A 0.28606069 0.69329617 0.24400084
2b-0.34454603 0.22380936 0.98825314
3 C 0.32576373 0.39845694-1.24206048
4 D-1.69658097 1.01347438 1.68266603
5 E-1.28548252-0.64785307-1.44289063
6 F-0.07503189 0.64845271 0.46543975
7 G 0.26693735 0.20734270-0.69366150
8小时0.05593404 0.06439014 0.08772557
9 I-2.30403431 0.66938092 0.95508038
10 J 0.18900414-0.37425445-0.17010088
>df%>%过滤器(如果所有(其中为数值),~.x>0)|!如果任何(其中为数值),~.x<0))
A x y z
1 A 0.28606069 0.69329617 0.24400084
2 E-1.28548252-0.64785307-1.44289063
3小时0.05593404 0.06439014 0.08772557

因此,目前还没有一种方法来处理Cross。谢谢你的回答没有,请查看我亲爱的朋友@AnilGoyal的版本,我也在研究它。请记住,您可以轻松地使用
purr
函数进行行操作。如果有两个以上的变量,这将不起作用。在这种情况下,我们必须使用
pmap
。这是一个很好的问题。我的朋友,这是一个很好的解决方案。我正试图找到一种方法,通过一个
函数来实现它。到目前为止,我失败了。:)我在这个问题上纠缠了几个小时。我不知道为什么它不能产生所需的输出!因为我们同时检查相互矛盾的条件。就像我们必须从
c(T,T)
c(T,F)
c(F,F)
中过滤相同的值一样。让我补充一个解释作为回答。是的,你是绝对正确的。谢谢你让我知道。期待我们将来讨论其他方法和问题。
df %>% filter(if_all(where(is.numeric), ~ .x > 0) | !if_any(where(is.numeric), ~ .x < 0))

# A tibble: 2 x 3
  x         y     z
  <chr> <dbl> <dbl>
1 b         1     1
2 c        -1    -1
df %>% filter(if_all(where(is.numeric), ~ .x > 0) | across(where(is.numeric), ~ .x < 0))

# A tibble: 2 x 3
  x         y     z
  <chr> <dbl> <dbl>
1 b         1     1
2 c        -1    -1
set.seed(201)
df <- data.frame(A = LETTERS[1:10], x = rnorm(10), y = rnorm(10), z = -1*rnorm(10))

> df
   A           x           y           z
1  A  0.28606069  0.69329617  0.24400084
2  B -0.34454603  0.22380936  0.98825314
3  C  0.32576373  0.39845694 -1.24206048
4  D -1.69658097  1.01347438  1.68266603
5  E -1.28548252 -0.64785307 -1.44289063
6  F -0.07503189  0.64845271  0.46543975
7  G  0.26693735  0.20734270 -0.69366150
8  H  0.05593404  0.06439014  0.08772557
9  I -2.30403431  0.66938092  0.95508038
10 J  0.18900414 -0.37425445 -0.17010088

> df %>% filter(if_all(where(is.numeric), ~ .x > 0) | !if_any(where(is.numeric), ~ .x < 0))
  A           x           y           z
1 A  0.28606069  0.69329617  0.24400084
2 E -1.28548252 -0.64785307 -1.44289063
3 H  0.05593404  0.06439014  0.08772557