当向量用作相等参数时,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
列进行比较。
我知道我们可以使用 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
列进行比较。