37

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

应将汇总统计量分配给与原始数据具有相同长度的新变量。也就是说,原始数据的每一行都应该有一个对应于当前组值的值——数据集应该折叠到每组一行。例如,考虑 group :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

4 回答 4

29

看看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)
于 2011-05-19T10:34:19.630 回答
29

您可以使用以下方法执行此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]
于 2016-02-23T19:40:02.693 回答
7

一种选择是使用plyr. ddply期望 a data.frame(第一个 d)并返回 a data.frame(第二个 d)。其他 XXply 函数以类似的方式工作;ieldply期望 alist并返回 a 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
于 2011-05-19T04:18:32.033 回答
3

这是使用基本函数aggregate和的另一个选项merge

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
于 2011-05-19T04:49:21.493 回答