问题描述
我使用 dplyr v1.0.2 来操作小标题。我想使用 group_by()
,使用函数或正则表达式来指定相关变量名称(...
参数)。我发现的唯一解决方案是笨拙的。有没有比较简单的方法?
这是一个演示问题的最小示例:
library(dplyr)
data(iris)
iris[,-(rbinom(1,1,.5) + 1) ] %>% # randomly drop "Sepal.Length" or "Sepal.Width"
group_by(matches("^Sepal\\."))
在第三行中,我随机删除了两个“Sepal”列之一。在最后一行,我想按剩余的“Sepal”列进行分组。问题是我不知道它的名字:它可能是“Sepal.Length”或“Sepal.Width”。最后一行中的 group_by()
命令不起作用:它可以预见地返回一条 matches() must be used within a *selecting* function
错误消息。
相比之下,这段代码有效,但有点笨拙:
iris[,.5) + 1) ] %>%
group_by(!!as.name(grep('Sepal',colnames(.),val = TRUE)))
有没有更简单的方法可以在第二行进行分组?
解决方法
如何使用 across
选择列
iris[,-(rbinom(1,1,.5) + 1) ] %>%
group_by(across(starts_with('Sepal')))
# A tibble: 150 x 4
# Groups: Sepal.Length [35]
Sepal.Length Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <fct>
1 5.1 1.4 0.2 setosa
2 4.9 1.4 0.2 setosa
3 4.7 1.3 0.2 setosa
4 4.6 1.5 0.2 setosa
5 5 1.4 0.2 setosa
6 5.4 1.7 0.4 setosa
7 4.6 1.4 0.3 setosa
8 5 1.5 0.2 setosa
9 4.4 1.4 0.2 setosa
10 4.9 1.5 0.1 setosa
# … with 140 more rows