给出简单的代码:
mtcars %>%
filter(am == 1 & cyl == 4)
使用 &
会返回:
mpg cyl disp hp drat wt qsec vs am gear carb
1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
2 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
3 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
4 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
5 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
6 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
7 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
8 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
我想使用 base::all
,得出相同的结果,但代码为:
mtcars %>%
filter(all(am == 1, cyl == 4))
没有产生预期的结果:
[1] mpg cyl disp hp drat wt qsec vs am gear carb
<0 rows> (or 0-length row.names)
因此我的问题是,如何在dplyr的过滤器中正确使用 all
?
dplyr版本:
>> packageVersion("dplyr")
[1] ‘0.7.4’
base / R版本:
>> packageVersion("base")
[1] ‘3.4.3’
答案 0 :(得分:3)
作为对@rosscova的好解释的补充,你可以试试
mtcars %>% rowwise() %>% filter(all(am == 1, cyl == 4))
答案 1 :(得分:1)
all
与&
略有不同,这就是为什么它在预期不能正常工作的原因。来自all
的文档:
让'x'表示所有逻辑向量的连接 '...'(在强制之后),如果请求删除'NA' 'na.rm = TRUE'。
如果“x”中的所有值都为“TRUE”,则返回的值为“TRUE” (包括如果没有值),如果至少有一个,则为'FALSE' 'x'中的值为'FALSE'。否则值为'NA'(只能是 如果'na.rm = FALSE'并且'...'不包含'FALSE'值并且在 至少一个'NA'值)。
&
和all
都会将多个逻辑向量作为输入,但&
将返回与每个输入相同长度的新逻辑向量,all
将始终返回单个逻辑值(如果所有值都符合条件,则为TRUE
,如果不符合,则为FALSE
。
filter
需要一个逻辑向量:TRUE
来保留一行,或FALSE
来丢弃它。单个逻辑值没有帮助。 filter
只能根据all
返回的单个逻辑值保留或丢弃所有行。