这是此处提出的问题的扩展: Aggregate / summarize multiple variables per group (e.g. sum, mean)

  • 具体来说, 如果我有多个变量到 aggregate ,有没有办法更改每个变量聚合的 FUN

  • 例子:
    dat <- data.frame(ID = rep(letters[1:3], each =3), Plot = rep(1:3,3),Val1 = (1:9)*10, Val2 = (1:9)*20)
    
    > dat
      ID Plot Val1 Val2
    1  a    1   10   20
    2  a    2   20   40
    3  a    3   30   60
    4  b    1   40   80
    5  b    2   50  100
    6  b    3   60  120
    7  c    1   70  140
    8  c    2   80  160
    9  c    3   90  180
    
    
    #Aggregate 2 variables using the *SAME* FUN
      aggregate(cbind(Val1, Val2) ~ ID, dat, sum)
    
      ID Val1 Val2
    1  a   60  120
    2  b  150  300
    3  c  240  480
    
  • 但请注意,两个变量都相加。

  • 如果我想取 Val1 的总和和 Val2 的平均值怎么办??

    我的最佳解决方案是:
    merge(
      aggregate(Val1 ~ ID, dat, sum),
      aggregate(Val2 ~ ID, dat, mean),
      by = c('ID')
    )
    
  • 但我想知道他们是否是一种更清洁/更短的方法来做这件事......

  • 我可以在 Aggregate 中完成这一切吗???
  • (我在 aggregate 代码中没有看到任何看起来可以工作的东西,但我以前错了......)

  • 示例#2:(如 requested ,使用 mtcars )
    Reduce(function(df1, df2) merge(df1, df2, by = c('cyl','am'), all = T),
        list(
        aggregate(hp ~ cyl + am, mtcars, sum, na.rm = T),
        aggregate(wt ~ cyl + am, mtcars, min),
        aggregate(qsec ~ cyl + am, mtcars, mean, na.rm = T),
        aggregate(mpg ~ cyl + am, mtcars, mean, na.rm = T)
      )
    )
    
    #I'd want a straightforward alternative like:
      aggregate(cbind(hp,wt,qsec,mpg) ~ cyl + am, mtcars, list(sum, min, mean, mean), na.rm = T)
    
      # ^(I know this doesn't work)
    

    注意:我更喜欢基本的 R 方法,但我已经意识到 dplyr 或其他一些包可能会“更好”

    最佳答案

    考虑列和函数的成对映射,然后运行 ​​Map 来构建聚合数据帧列表,因为 aggregate 允许函数名称的字符串值。然后运行 ​​Reduce 将所有数据帧元素合并在一起。

    cols <- names(dat)[grep("Val", names(dat))]
    fcts <- c("mean", "sum")
    
    df_list <- Map(function(c, f) aggregate(.~ID, dat[c("ID", c)], FUN=f), cols, fcts)
    
    final_df <- Reduce(function(x,y) merge(x, y, by="ID"), df_list)
    
    final_df
    #   ID Val1 Val2
    # 1  a   20  120
    # 2  b   50  300
    # 3  c   80  480
    

    确保列和函数向量的长度相同,可能需要重复函数。

    并用 mtcars 进行演示:
    cols <- c("hp", "wt", "qsec", "mpg")
    fcts <- c("sum", "min", "mean", "mean")
    
    df_list <- Map(function(c, f) aggregate(.~cyl+am, mtcars[c("cyl", "am", c)], FUN=f), cols, fcts)
    
    Reduce(function(x,y) merge(x,y, by=c("cyl", "am")), df_list)
    
    #   cyl am   hp    wt     qsec      mpg
    # 1   4  0  254 2.465 20.97000 22.90000
    # 2   4  1  655 1.513 18.45000 28.07500
    # 3   6  0  461 3.215 19.21500 19.12500
    # 4   6  1  395 2.620 16.32667 20.56667
    # 5   8  0 2330 3.435 17.14250 15.05000
    # 6   8  1  599 3.170 14.55000 15.40000
    

    关于r - 在 R 中使用多个不同的 FUN 聚合多个变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50106728/

    10-12 17:24