【问题标题】:Mean per group in a column, result per row列中每组的平均值,每行的结果
【发布时间】:2015-07-22 17:10:34
【问题描述】:

我有这个数据框(根据@Vinterwoo 的代码调整),我正在寻找一个函数来获取每列的每组平均值。因此,C1 和 C2 列中 A 组的平均值,B 组的平均值等。我知道如何获得每组的平均值(例如使用aggregate),但我需要在相应组的每一行中显示平均值(请参阅所需的输出)。

C1 <- c(3,2,4,3,6,7,5)
C2 <- c(3,7,3,4,5,2,1)
DF <- data.frame(ID=c("A","C","A","C","E","F","E"),C1=C1,C2=C2)

ID C1 C2
A  3  3
C  2  7
A  4  3
C  3  4
E  6  5
F  7  2
E  5  1

期望的输出:

ID C1 C2 avg.C1 avg.C2
A  3  3    3.5    3.0
C  2  7    2.5    5.5
A  4  3    3.5    3.0
C  3  4    2.5    5.5
E  6  5    5.5    3.0
F  7  2    7.0    2.0
E  5  1    5.5    3.0

【问题讨论】:

    标签: r dataframe mean


    【解决方案1】:

    已经发布了一些很好的答案,但我很惊讶没有人提到ave(),它基本上就是为此目的而设计的;它甚至可以在没有任何刺激的情况下运行mean()

    cbind(DF,avg.C1=ave(DF$C1,DF$ID),avg.C2=ave(DF$C2,DF$ID));
    ##   ID C1 C2 avg.C1 avg.C2
    ## 1  A  3  3    3.5    3.0
    ## 2  C  2  7    2.5    5.5
    ## 3  A  4  3    3.5    3.0
    ## 4  C  3  4    2.5    5.5
    ## 5  E  6  5    5.5    3.0
    ## 6  F  7  2    7.0    2.0
    ## 7  E  5  1    5.5    3.0
    

    【讨论】:

      【解决方案2】:

      我建议为此使用“data.table”包:

      sdcols <- names(DF)[-1]      ## A vector of the new columns we want to add
      as.data.table(DF)[, paste(sdcols, "mean", sep = "_") := lapply(.SD, mean), 
                        by = ID][] ## you can also be more specific and specify sdcols
      #    ID C1 C2 C1_mean C2_mean
      # 1:  A  3  3     3.5     3.0
      # 2:  C  2  7     2.5     5.5
      # 3:  A  4  3     3.5     3.0
      # 4:  C  3  4     2.5     5.5
      # 5:  E  6  5     5.5     3.0
      # 6:  F  7  2     7.0     2.0
      # 7:  E  5  1     5.5     3.0
      

      如注释代码中所示,您可以使用 .SDcols 参数指定要对哪些列进行操作:

      sdcols <- names(DF)[-1]
      as.data.table(DF)[, paste(sdcols, "mean", sep = "_") := lapply(.SD, mean), 
                        by = ID, .SDcols = sdcols][]
      

      【讨论】:

        【解决方案3】:

        你可以像下面这样使用聚合和合并

        DF2=aggregate(cbind(C1, C2) ~ ID , data= DF , FUN= mean)
        DF_Wanted= merge(DF, DF2, by=c("ID"), all=TRUE)
        

        【讨论】:

          【解决方案4】:

          如果您要使用base 创建一个新列,您可以简单地计算所需的值并将它们分配给列。为了计算它,你取每个 ID 等于它自己的 C 的平均值:

          DF$avg.C1 <- sapply(1:nrow(DF), function(i) mean(DF$C1[DF$ID==DF$ID[i]]))
          DF$avg.C2 <- sapply(1:nrow(DF), function(i) mean(DF$C2[DF$ID==DF$ID[i]]))
          

          【讨论】:

            【解决方案5】:

            试试:

            library(dplyr)
            DF %>% group_by(ID) %>% mutate(avg.C1 = mean(C1), avg.C2 = mean(C2))
            

            这给出了:

            #Source: local data frame [7 x 5]
            #Groups: ID
            #
            #  ID C1 C2 avg.C1 avg.C2
            #1  A  3  3    3.5    3.0
            #2  C  2  7    2.5    5.5
            #3  A  4  3    3.5    3.0
            #4  C  3  4    2.5    5.5
            #5  E  6  5    5.5    3.0
            #6  F  7  2    7.0    2.0
            #7  E  5  1    5.5    3.0
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-05
              • 1970-01-01
              • 2023-01-31
              • 2021-11-08
              相关资源
              最近更新 更多