计算组平均值(或其他摘要统计数据)并分配给原始数据

时间:2011-05-19 04:03:23

标签: r mean r-faq

我想计算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

4 个答案:

答案 0 :(得分:17)

查看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)

答案 1 :(得分:16)

您可以使用dplyr

mutate中执行此操作
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]

答案 2 :(得分:7)

一种选择是使用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

答案 3 :(得分:3)

以下是使用基本函数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