【问题标题】:Summarize by column: mean and sum按列汇总:均值和总和
【发布时间】:2020-03-12 20:21:42
【问题描述】:

我正在尝试按组汇总变量列表。一些变量需要求和,而另一些需要平均。

我有这个:

Group    Variable1     Variable2
1        10            2
1        12            6
2        6             7
2        4             9

我想要变量 1 的总和和变量 2 的平均值:

Group    Variable1     Variable2
1        22            4
2        10            8

我一直在使用 dplyr 来获取组和:

sum <- (df %>% 
  group_by(Group) %>% 
  summarise_all(funs(sum)))

我正在尝试找到一种方法来选择对哪些列求和以及对汇总函数取平均值。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    dplyr 的开发版本可以通过across 选择性地将不同的函数应用于不同的变量集

    library(dplyr)
    df %>%
       group_by(Group) %>%
       summarise(across(Variable1:Variable2, sum), across(Variable3:Variable5, mean))
    # A tibble: 2 x 6
    #  Group Variable1 Variable2 Variable3 Variable4 Variable5
    #  <int>     <int>     <int>     <dbl>     <dbl>     <dbl>
    #1     1        22         8      18.5         5      24  
    #2     2        10        16      11           7      20.5
    

    数据

    df <- structure(list(Group = c(1L, 1L, 2L, 2L), Variable1 = c(10L, 
    12L, 6L, 4L), Variable2 = c(2L, 6L, 7L, 9L), Variable3 = c(24L, 
    13L, 10L, 12L), Variable4 = c(3L, 7L, 9L, 5L), Variable5 = c(26L, 
    22L, 23L, 18L)), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

      【解决方案2】:

      具有更多列的示例数据:

      df <- structure(list(Group = c(1L, 1L, 2L, 2L), Variable1 = c(10L, 
      12L, 6L, 4L), Variable2 = c(2L, 6L, 7L, 9L), Variable3 = c(9L, 
      8L, 10L, 2L), Variable4 = c(8L, 7L, 9L, 5L)), row.names = c(NA, 
      -4L), class = "data.frame")
      
      #    Group Variable1 Variable2 Variable3 Variable4
      # 1:     1        10         2         9         8
      # 2:     1        12         6         8         7
      # 3:     2         6         7        10         9
      # 4:     2         4         9         2         5
      

      创建变量名向量并在data.table中使用mget + lapply

      library(data.table)
      setDT(df)
      
      df[, c(lapply(mget(paste0('Variable', 1:2)), sum), 
             lapply(mget(paste0('Variable', 3:4)), mean)),
         by = Group]
      
      #    Group Variable1 Variable2 Variable3 Variable4
      # 1:     1        22         8       8.5       7.5
      # 2:     2        10        16       6.0       7.0
      

      【讨论】:

        【解决方案3】:

        这是使用merge + aggregate 的基本 R 解决方案,即

        dfout <- merge(aggregate(Variable1~Group,df,sum),
                       aggregate(Variable2~Group,df,mean))
        

        这样

        > dfout
          Group Variable1 Variable2
        1     1        22         4
        2     2        10         8
        

        数据

        df <- structure(list(Group = c(1L, 1L, 2L, 2L), Variable1 = c(10L, 
        12L, 6L, 4L), Variable2 = c(2L, 6L, 7L, 9L)), class = "data.frame", row.names = c(NA, 
        -4L))
        

        【讨论】:

          【解决方案4】:

          我们可以使用mutate_at 将函数应用于多个列,然后选择每个组中的第一行以获取汇总值。

          library(dplyr)
          
          df %>%
            group_by(Group) %>%
            mutate_at(vars(Variable1:Variable2), sum) %>%
            mutate_at(vars(Variable3:Variable4), mean) %>%
            slice(1L)
          
          #  Group Variable1 Variable2 Variable3 Variable4
          #  <int>     <int>     <int>     <dbl>     <dbl>
          #1     1        22         8       8.5       7.5
          #2     2        10        16       6         7  
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-01-03
            • 1970-01-01
            • 2021-09-27
            相关资源
            最近更新 更多