【问题标题】:specify variable names when grouping分组时指定变量名
【发布时间】:2020-12-22 15:10:50
【问题描述】:

我正在使用 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[, -(rbinom(1, 1, .5) + 1) ]  %>%
  group_by(!!as.name(grep('Sepal', colnames(.), val = TRUE)))

有没有更简单的方法在第二行进行分组?

【问题讨论】:

    标签: r dplyr tidyeval nse


    【解决方案1】:

    如何使用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
    

    【讨论】:

    • 谢谢。我没有意识到across() 也可以轻松地与grep() 等普通函数一起使用,但它确实可以:iris[, -(rbinom(1, 1, .5) + 1) ] %&gt;% group_by(across(grep('^Sepal', ., val = TRUE))) 产生相同的结果。这仍然没有我想要的那么干净,但这是朝着正确方向迈出的一步。
    • @user697473 当你说不不像我想要的那样干净你到底想要什么?
    • 不需要三个右括号的东西。理想情况下,group_by() 中的单个函数,而不是嵌套在另一个函数中的一个函数。我怀疑这是可能的,但也许我错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多