如何正确使用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)
  • 基本/R版本:

    >> 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))