除了@thelatemail的建议外,您还可以使用filter_at并将列号传递给vars参数:
iris %>% filter_at(1, all_vars(. > 6))
Run Code Online (Sandbox Code Playgroud)
all(iris %>% filter_at(1, all_vars(. > 6)) == iris[iris[,1] > 6, ])
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
范围动词 ( _if,, ) 以及扩展后的and已_at被取代。对于函数和 ,它被创建来组合多个列的逻辑以帮助子集化(这些动词在 dplyr >= 1.0.4 中可用):_allall_vars()any_vars()across()filterif_anyif_all
if_any() 和 if_all() 与 with 一起使用,将相同的谓词函数应用于选定的列,并将结果组合到单个逻辑向量中。
across、if_any、 和 的第一个参数if_any仍然是用于列选择的整洁选择语法,其中包括按列位置进行选择。
单柱
在单列情况下,您可以执行任何操作以获得相同的结果:
iris %>%
filter(across(1, ~ . > 6))
iris %>%
filter(if_any(1, ~ . > 6))
iris %>%
filter(if_all(1, ~ . > 6))
Run Code Online (Sandbox Code Playgroud)
多列
如果您跨多个列应用谓词函数或公式,则across可能会产生意外结果,在这种情况下您应该使用if_anyand if_all:
iris %>%
filter(if_all(c(2, 4), ~ . > 2.3)) # by column position
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 6.3 3.3 6.0 2.5 virginica
2 7.2 3.6 6.1 2.5 virginica
3 5.8 2.8 5.1 2.4 virginica
4 6.3 3.4 5.6 2.4 virginica
5 6.7 3.1 5.6 2.4 virginica
6 6.7 3.3 5.7 2.5 virginica
Run Code Online (Sandbox Code Playgroud)
请注意,这将返回所有选定列的值都大于 2.3 的行,这是任何选定列满足逻辑的行的子集:
iris %>%
filter(if_any(ends_with("Width"), ~ . > 2.3)) # same columns selection as above
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 6.7 3.3 5.7 2.5 virginica
7 6.7 3.0 5.2 2.3 virginica
8 6.3 2.5 5.0 1.9 virginica
9 6.5 3.0 5.2 2.0 virginica
10 6.2 3.4 5.4 2.3 virginica
11 5.9 3.0 5.1 1.8 virginica
Run Code Online (Sandbox Code Playgroud)
对于本示例,上面的输出被缩短以更加紧凑。
没有魔法,只需使用上面的项目列号,而不是变量(列)名称:
library("dplyr")
iris %>%
filter(iris[,1] > 6)
Run Code Online (Sandbox Code Playgroud)
正如@eipi10 评论的那样更好
iris %>%
filter(.[[1]] > 6)
Run Code Online (Sandbox Code Playgroud)