【问题标题】:Calculate group mean, sum, or other summary stats. and assign column to original data计算组平均值、总和或其他汇总统计数据。并将列分配给原始数据
【发布时间】:2022-01-13 01:28:27
【问题描述】:

我想计算每个级别内的数值变量(“值”)的mean(或任何其他长度为 1 的汇总统计数据,例如 minmaxlengthsum)分组变量(“组”)。

应将汇总统计数据分配给与原始数据具有相同长度的新变量。也就是说,原始数据的每一行都应该有一个对应于当前组值的值——数据集应该折叠成每组一行。例如,考虑组mean

之前

id  group  value
1   a      10
2   a      20
3   b      100
4   b      200

之后

id  group  value  grp.mean.values
1   a      10     15
2   a      20     15
3   b      100    150
4   b      200    150

【问题讨论】:

    标签: r mean summary dplyr r-faq


    【解决方案1】:

    一种选择是使用plyrddply 需要 data.frame(第一个 d)并返回 data.frame(第二个 d)。其他 XXply 函数以类似的方式工作;即ldply 期望list 并返回data.framedlply 则相反......等等。第二个参数是分组变量。第三个参数是我们要为每个组计算的函数。

    require(plyr)
    ddply(dat, "group", transform, grp.mean.values = mean(value))
    
      id group value grp.mean.values
    1  1     a    10              15
    2  2     a    20              15
    3  3     b   100             150
    4  4     b   200             150
    

    【讨论】:

      【解决方案2】:

      这是使用基本函数aggregatemerge 的另一个选项:

      merge(x, aggregate(value ~ group, data = x, mean), 
           by = "group", suffixes = c("", "mean"))
      
        group id value.x value.y
      1     a  1      10      15
      2     a  2      20      15
      3     b  3     100     150
      4     b  4     200     150
      

      您可以使用suffixes 获得“更好”的列名:

      merge(x, aggregate(value ~ group, data = x, mean), 
           by = "group", suffixes = c("", ".mean"))
      
      
        group id value value.mean
      1     a  1    10         15
      2     a  2    20         15
      3     b  3   100        150
      4     b  4   200        150
      

      【讨论】:

        【解决方案3】:

        看看ave 函数。类似的东西

        df$grp.mean.values <- ave(df$value, df$group)
        

        如果您想使用ave 计算每个组的其他内容,您需要指定FUN = your-desired-function,例如FUN = min:

        df$grp.min <- ave(df$value, df$group, FUN = min)
        

        【讨论】:

          【解决方案4】:

          您可以使用mutatedplyr 中执行此操作:

          library(dplyr)
          df %>%
            group_by(group) %>%
            mutate(grp.mean.values = mean(value))
          

          ...或使用data.table 通过引用分配新列(:=):

          library(data.table)
          setDT(df)[ , grp.mean.values := mean(value), by = group]
          

          【讨论】:

            猜你喜欢
            • 2020-10-13
            • 1970-01-01
            • 2013-02-25
            • 1970-01-01
            • 2023-03-13
            • 1970-01-01
            相关资源
            最近更新 更多