【问题标题】:Use column index instead of name in group_by在 group_by 中使用列索引而不是名称
【发布时间】:2018-03-08 06:29:48
【问题描述】:

我想用 dplyr 总结一个数据框,像这样:

> test <-data.frame(ID = c("A", "A", "B", "B"), val = c(1:4))
> test %>% group_by(ID) %>% summarize(av = mean(val))
# A tibble: 2 x 2
      ID    av
  <fctr> <dbl>
1      A   1.5
2      B   3.5

但是假设我不想按名为“ID”的列进行分组,而是希望按第一列进行分组,而不管其名称如何。有没有简单的方法来做到这一点?

我尝试了一些天真的方法(group_by(1)group_by(.[1])group_by(., .[1])group_by(names(.)[1]) 无济于事。我才刚刚开始使用 tidyverse 包,所以我可能会遗漏一些明显的东西。

This question 非常相似,但它是关于变异的,我无法将其概括为我的问题。 This question 也类似,但公认的答案是使用不同的包,我正在尝试坚持使用 dplyr。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以为此使用 scoped 变体之一 (group_by_at):

    test %>% group_by_at(1) %>% summarise(av = mean(val))
    
    # A tibble: 2 x 2
    #      ID    av
    #  <fctr> <dbl>
    #1      A   1.5
    #2      B   3.5
    

    【讨论】:

      【解决方案2】:

      您可以使用across 版本1.0.0 起的功能:

      library(dplyr)
      test %>% 
        group_by(across(1)) %>% 
        summarise(av = mean(val))
      ## A tibble: 2 x 2
      #  ID       av
      #  <fct> <dbl>
      #1 A       1.5
      #2 B       3.5
      

      【讨论】:

        【解决方案3】:

        在旧版本的dpylyr 中,您可以使用dplyr::group_by_ 的标准评估:

        test %>% 
         group_by_(names(.)[1]) %>% 
         summarize(av = mean(val))
        ## A tibble: 2 x 2
        #      ID    av
        #  <fctr> <dbl>
        #1      A   1.5
        #2      B   3.5
        

        【讨论】:

        【解决方案4】:

        如果我们需要使用NSE,那么可以使用sym!!

        test %>%
             group_by(!! rlang::sym(names(.)[1])) %>%
             summarise(av = mean(val))
        # A tibble: 2 x 2
        #      ID    av
        #  <fctr> <dbl>
        #1      A   1.5
        #2      B   3.5
        

        我们也可以创建一个函数。如果我们传递带引号的字符串,那么我们使用 sym!! 或者使用 enquo/!! 路由

        f1 <- function(dat, grp, valueCol) {
             dat %>%
                group_by(!! rlang::sym(grp)) %>%
                summarise(av = mean(!! rlang::sym(valueCol)))
        }
        
        f1(test, "ID", "val")
        # A tibble: 2 x 2
        #      ID    av
        #  <fctr> <dbl>
        #1      A   1.5
        #2      B   3.5
        

        【讨论】:

        • 这比我实际需要的问题要复杂,但它让我走上了一条关于评估和programming with dplyr 的富有成效的学习之路
        猜你喜欢
        • 2013-04-17
        • 2021-09-09
        • 2021-01-04
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        相关资源
        最近更新 更多