当向量用作相等参数时,dplyr::filter 的行为是什么?

What is the behavior of dplyr::filter when a vector is used as an argument for equality?

我知道我们可以使用 dplyr::filter 使用逻辑 OR 过滤列中的多个值:

library(tidyverse)
diamonds
# A tibble: 53,940 x 10

filter(diamonds, cut == 'Good' | cut == 'Premium')
# A tibble: 18,697 x 10

我们可以将 %in% 运算符与向量一起使用来简化此语法:

filter(diamonds, cut %in% c('Good', 'Premium'))
# A tibble: 18,697 x 10

一切顺利。但是如果我使用会发生什么:

filter(diamonds, cut == c('Good', 'Premium'))
# A tibble: 9,369 x 10

生成的 tibble 在 diamonds$cut 列中仅包含 'Good''Premium' 值,如 unique 所报告。但是,它包含的行数大约是之前经过适当过滤的示例的总行数的一半。

起初我以为 R 会每隔一行跳过一次,但在结果 运行 head 之后,情况似乎并非如此。任何人都可以阐明最后一个示例的内部情况吗?

所以,这里的要点是您传递的向量被回收:'Good', 'Premium', 'Good', 'Premium'...。如果将其创建为变量,则可以看到:

df %>%
    mutate(filterThis = cut == c('Good', 'Premium'))

   carat cut       color clarity depth table price     x     y     z filterThis
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl> <lgl>     
 1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43 FALSE     
 2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31 TRUE      
 3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31 TRUE      
 4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63 TRUE      
 5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75 TRUE      
 6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48 FALSE     
 7 0.24  Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47 FALSE     
 8 0.26  Very Good H     SI1      61.9    55   337  4.07  4.11  2.53 FALSE     
 9 0.22  Fair      E     VS2      65.1    61   337  3.87  3.78  2.49 FALSE     
10 0.23  Very Good H     VS1      59.4    61   338  4     4.05  2.39 FALSE 

想象 'Good', 'Premium', 'Good', 'Premium'... 并将其与 cut 列进行比较。