我目前正在编写我的 R 脚本,所以我并不是真的在寻找 tidyverse 之外的答案或使用已弃用/取代的语法。我发现 dplyr 处理数据的方式很容易读写,所以我尽量坚持下去。
使用 iris 数据集,这里是我想要做的事情的简化版本,在被取代的语法中(工作正常):
filter_at(iris, vars(starts_with("sepal")), any_vars(. > 3))
Run Code Online (Sandbox Code Playgroud)
显然,我可以用长格式编写条件以避免使用filter_at()and any_vars():
filter(iris, Sepal.Length > 3 | Sepal.Width > 3)
Run Code Online (Sandbox Code Playgroud)
但它是多余的,而且大多数情况下,如果像在我的情况下,列名不完全已知,则不适用。
在 dplyr 的小插图("colwise") 中,它指出:
以前,filter() 与 all_vars() 和 any_vars() 助手配对。现在,cross() 等效于 all_vars(),并且没有直接替代 any_vars()。但是,您可以自己制作一个简单的助手:
接下来是一个非常简单的例子(任何值 > 0,所以我们只需要使用rowSums())。我觉得across()在过滤的特定情况下它缺乏一个分离版本来保持相同的表现力。
在您看来,在不必枚举所有列或使用被取代的函数的情况下实现相同过滤的最简洁的语法是什么?
我们可以使用filterwithacrossreduce
library(dplyr)
library(purrr)
iris %>%
filter(across(starts_with("sepal"), ~ . > 5) %>% reduce(`|`))
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1 5.1 3.5 1.4 0.2 setosa
#2 5.4 3.9 1.7 0.4 setosa
#3 5.4 3.7 1.5 0.2 setosa
#4 5.8 4.0 1.2 0.2 setosa
#5 5.7 4.4 1.5 0.4 setosa
#6 5.4 3.9 1.3 0.4 setosa
#7 5.1 3.5 1.4 0.3 setosa
# ...
Run Code Online (Sandbox Code Playgroud)