dply >= 1.0.0
作用域动词(_if、_at、_all)以及扩展名all_vars() 和any_vars() 已被across() 取代。在 filter 的情况下,已创建函数 if_any and if_all 以跨多个列组合逻辑以帮助子集(这些动词在 dplyr >= 1.0.4 中可用):
if_any() 和 if_all() 用于将相同的谓词函数应用于选择的列并将结果组合成一个逻辑向量。
across、if_any 和 if_any 的第一个参数仍然是用于列选择的 tidy-select 语法,其中包括按列位置进行选择。
单列
在您的 single 列案例中,您可以使用相同的结果执行任何操作:
iris %>%
filter(across(1, ~ . > 6))
iris %>%
filter(if_any(1, ~ . > 6))
iris %>%
filter(if_all(1, ~ . > 6))
多列
如果您在多个列中应用谓词函数或公式,那么across 可能会产生意外结果,在这种情况下您应该使用if_any 和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
请注意,这将返回 所有 选定列的值大于 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
上面的输出在这个例子中被缩短了。