如何正确使用dplyr';s过滤器?
给定简单代码:如何正确使用dplyr';s过滤器?,r,filter,dplyr,R,Filter,Dplyr,给定简单代码: 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.9
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)
>> packageVersion("base")
[1] ‘3.4.3’
所有
与&
略有不同,这就是为什么它不能按预期工作的原因。从所有的文档中:
让‘x’表示所有逻辑向量的串联
“…”(在强制之后),在删除“NA”后,如果
“na.rm=TRUE”
如果“x”中的所有值均为“TRUE”,则返回的值为“TRUE”
(如果没有值,则包括),如果至少有一个
“x”中的值为“FALSE”。否则,该值为“NA”(仅适用于
如果“na.rm=FALSE”和“…”不包含“FALSE”值,则在
至少一个“NA”值)
&
和all
都将采用多个逻辑向量作为输入,但如果&
将返回一个与每个输入长度相同的新逻辑向量,all
将始终返回一个逻辑值(TRUE
如果所有值都符合条件,如果不符合条件,FALSE
)
filter
需要一个逻辑向量:TRUE
保留一行,或者FALSE
放弃它。单个逻辑值没有帮助filter
只能根据all
返回的单个逻辑值保留或放弃所有行,作为@rosscova的一个附加说明,您可以尝试一下
mtcars %>% rowwise() %>% filter(all(am == 1, cyl == 4))
你必须这样做吗mtcars%%>%rowwise()%%>%filter(all(am==1,cyl==4))
@Jimbou如果可以的话,我建议你回答一下。我不喜欢rowwise方法,因为数据是在事后分组的。也许有更好的解决办法。@Jimbou Fair point,这绝对不是直观的。我不认为所有的
都应该这样做all
检查向量中的“所有”值是否符合给定的条件集,而不是检查向量中的每个值是否符合条件。这就是它按行运行的原因。这是准确的,但我认为这里应该包括一个注意事项,即使用&
,避免按行运行将更加有效。在我对10000行数据帧的基准测试中,与使用&
相比,此方法的执行时间要长300倍以上。更不用说代码也更简洁了。
mtcars %>% rowwise() %>% filter(all(am == 1, cyl == 4))