【问题标题】:Pass column names as strings to group_by and summarize将列名作为字符串传递给 group_by 并汇总
【发布时间】:2018-04-05 17:10:33
【问题描述】:

dplyr 从 0.7 版开始,不推荐使用以下划线结尾的方法,例如 summarise_group_by_,因为我们应该使用 quosures。

见: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

我正在尝试使用 quo 和 !!

工作示例:

df <- data.frame(x = c("a","a","a","b","b","b"), y=c(1,1,2,2,3,3), z = 1:6)

lFG <- df %>% 
   group_by( x,y) 
lFG %>% summarize( min(z))

但是,在这种情况下,我需要将要分组和汇总的列指定为字符串。

cols2group <- c("x","y")
col2summarize <- "z"

我怎样才能得到与上面相同的例子?

【问题讨论】:

    标签: r dplyr summarize rlang quosure


    【解决方案1】:

    为此,您现在可以使用动词的_at 版本

    df %>%  
      group_by_at(cols2group) %>% 
      summarize_at(.vars = col2summarize, .funs = min)
    

    编辑 (2021-06-09):请参阅 Ronak Shah 的回答,现在使用 muate(across(all_of(cols2summarize), min)) 是首选选项

    【讨论】:

      【解决方案2】:

      另一种选择是使用非标准评估 (NSE),并让 R 将字符串解释为带引号的对象名称:

      cols2group <- c("x","y")
      col2summarize <- "z"
      
      df %>%  
        group_by(!!rlang::sym(cols2group)) %>% 
        summarize(min(!!rlang::sym(col2summarize)))
      

      rlang::sym() 函数获取字符串并将它们转换为引号,而引号又被 !! 引用,并用作 df 上下文中的名称,它们引用相关列。与往常一样,做同一件事有不同的方法,这是我倾向于使用的速记!

      【讨论】:

        【解决方案3】:

        请参阅 ?dplyr::across 了解更新的方法,因为 group_by_at 和 summarise_at 现在已被取代

        【讨论】:

          【解决方案4】:

          dplyr 1.0.0 你可以使用across

          library(dplyr)
          
          cols2group <- c("x","y")
          col2summarize <- "z"
          
          df %>%
            group_by(across(all_of(cols2group))) %>%
            summarise(across(all_of(col2summarize), min)) %>%
            ungroup
          
          #   x       y     z
          #  <chr> <dbl> <int>
          #1 a         1     1
          #2 a         2     3
          #3 b         2     4
          #4 b         3     5
          

          【讨论】:

          • 为什么需要all_of ?我只是没有使用它,它按预期工作。它适用于 Spark!
          • 它会按预期工作,但它会给你一个警告(每个会话一次)Note: Using an external vector in selections is ambiguous.ℹ Use `all_of(cols2group)` instead of `cols2group` to silence this message.
          猜你喜欢
          • 2021-01-19
          • 1970-01-01
          • 2018-05-15
          • 2021-11-14
          • 1970-01-01
          • 2022-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多