【问题标题】:how to calculate mean/median per group in a dataframe in r [duplicate]如何计算r中数据帧中每组的平均值/中位数[重复]
【发布时间】:2014-10-01 15:14:22
【问题描述】:

我有一个数据框,详细记录了客户花了多少钱,如下所示:

custid, value
1,  1
1,  3
1,  2
1,  5
1,  4
1,  1
2,  1
2,  10
3,  1
3,  2
3,  5

如何使用 mean、max、median、std 等计算特征,如下所示?使用一些应用功能?怎么做?

custid, mean, max,min,median,std
1,  ....
2,....
3,....

【问题讨论】:

    标签: r mean median


    【解决方案1】:
    library(dplyr)
    dat%>%
    group_by(custid)%>% 
    summarise(Mean=mean(value), Max=max(value), Min=min(value), Median=median(value), Std=sd(value))
    #  custid     Mean Max Min Median      Std
    #1      1 2.666667   5   1    2.5 1.632993
    #2      2 5.500000  10   1    5.5 6.363961
    #3      3 2.666667   5   1    2.0 2.081666
    

    对于更大的数据集,data.table 会更快

    setDT(dat)[,list(Mean=mean(value), Max=max(value), Min=min(value), Median=as.numeric(median(value)), Std=sd(value)), by=custid]
    #   custid     Mean Max Min Median      Std
    #1:      1 2.666667   5   1    2.5 1.632993
    #2:      2 5.500000  10   1    5.5 6.363961
    #3:      3 2.666667   5   1    2.0 2.081666
    

    【讨论】:

      【解决方案2】:

      我喜欢 psych 包中的 describeBy()。像这样

      df <- structure(list(custid. = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 3L, 
      3L, 3L), value = c(1L, 3L, 2L, 5L, 4L, 1L, 1L, 10L, 1L, 2L, 5L
      )), .Names = c("custid.", "value"), class = "data.frame", row.names = c(NA, 
      -11L))
      df
             custid. value
      1        1     1
      2        1     3
      3        1     2
      4        1     5
      5        1     4
      6        1     1
      7        2     1
      8        2    10
      9        3     1
      10       3     2
      11       3     5
      # install.packages(c("psych"), dependencies = TRUE)
      require(psych)
      
       describeBy(df$value, df$custid.)
      group: 1
        vars n mean   sd median trimmed  mad min max range skew kurtosis   se
      1    1 6 2.67 1.63    2.5    2.67 2.22   1   5     4 0.21    -1.86 0.67
      ----------------------------------------------------------------------- 
      group: 2
        vars n mean   sd median trimmed  mad min max range skew kurtosis  se
      1    1 2  5.5 6.36    5.5     5.5 6.67   1  10     9    0    -2.75 4.5
      ----------------------------------------------------------------------- 
      group: 3
        vars n mean   sd median trimmed  mad min max range skew kurtosis  se
      1    1 3 2.67 2.08      2    2.67 1.48   1   5     4 0.29    -2.33 1.2
      

      如果您愿意,也可以将其作为矩阵获取,

       describeBy(df$value, df$custid., mat=T, skew = F)
         item group1 vars n     mean       sd median min max range        se
      11    1      1    1 6 2.666667 1.632993    2.5   1   5     4 0.6666667
      12    2      2    1 2 5.500000 6.363961    5.5   1  10     9 4.5000000
      13    3      3    1 3 2.666667 2.081666    2.0   1   5     4 1.2018504
      

      【讨论】:

      • @AnandaMahto,快点。我很抱歉。我已经更新了我的答案。
      【解决方案3】:

      你可以使用 plyr 包

      拆分应用组合策略

      ddply(dataframe, .(groupcol), function)

      你的情况

      ddply(dataframe, .(custid), summarize, "mean"= mean(value), "median" = median(value))

      看看 ddply 的帮助,你有一个很好的例子

      【讨论】:

        【解决方案4】:

        要添加替代方案,这里是“doBy”包中的summaryBy,您可以使用它指定要应用的函数的list

        library(doBy)
        summaryBy(value ~ custid, data = mydf, 
                  FUN = list(mean, max, min, median, sd))
        #   custid value.mean value.max value.min value.median value.sd
        # 1      1   2.666667         5         1          2.5 1.632993
        # 2      2   5.500000        10         1          5.5 6.363961
        # 3      3   2.666667         5         1          2.0 2.081666
        

        当然,你也可以坚持使用base R:

        myFun <- function(x) {
          c(min = min(x), max = max(x), 
            mean = mean(x), median = median(x), 
            std = sd(x))
        }
        
        tapply(mydf$value, mydf$custid, myFun)
        # $`1`
        #      min      max     mean   median      std 
        # 1.000000 5.000000 2.666667 2.500000 1.632993 
        # 
        # $`2`
        #       min       max      mean    median       std 
        #  1.000000 10.000000  5.500000  5.500000  6.363961 
        # 
        # $`3`
        #      min      max     mean   median      std 
        # 1.000000 5.000000 2.666667 2.000000 2.081666 
        
        cbind(custid = unique(mydf$custid), 
              do.call(rbind, tapply(mydf$value, mydf$custid, myFun)))
        #   custid min max     mean median      std
        # 1      1   1   5 2.666667    2.5 1.632993
        # 2      2   1  10 5.500000    5.5 6.363961
        # 3      3   1   5 2.666667    2.0 2.081666
        

        【讨论】:

          【解决方案5】:

          如果您想使用dplyr 将更多的函数应用于所有或相同的列,我推荐summarise_eachmutate_each

          require(dplyr)
          dat %>%
            group_by(custid) %>%
            summarise_each(funs(max, min, mean, median, sd), value)
          #Source: local data frame [3 x 6]
          #
          #  custid max min     mean median       sd
          #1      1   5   1 2.666667    2.5 1.632993
          #2      2  10   1 5.500000    5.5 6.363961
          #3      3   5   1 2.666667    2.0 2.081666
          

          或其他带有基本 R 的选项aggregate

          aggregate(value ~ custid, data = dat, summary)
          #  custid value.Min. value.1st Qu. value.Median value.Mean value.3rd Qu. value.Max.
          #1      1      1.000         1.250        2.500      2.667         3.750      5.000
          #2      2      1.000         3.250        5.500      5.500         7.750     10.000
          #3      3      1.000         1.500        2.000      2.667         3.500      5.000
          

          (这不包括标准偏差,但我认为这是其他描述性统计数据的好方法。)

          【讨论】:

          • 对此的更新,该函数返回以下消息:summarise_each() 已弃用。请改用summarise_all()summarise_at()summarise_if()。要将funs 映射到选择的变量上,请使用summarise_at()
          猜你喜欢
          • 1970-01-01
          • 2021-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多