如何在dplyr的过滤器中正确使用all?

时间:2018-05-08 12:03:02

标签: 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.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’
    

2 个答案:

答案 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返回的单个逻辑值保留或丢弃所有行。