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

Mik*_*ike 22 r mean r-faq

我想要计算mean(或任何其他摘要长度之一,例如统计min,max,length,sum)的数值变量("值")的分组变量("基团")的每个水平内.

摘要统计应该被分配到具有一个新的变量相同的长度原始数据.即,原始数据中的每一行应该具有对应于当前组值的值-该数据组应该被折叠,以便每组中的一行.例如,考虑组mean:

之前

id  group  value
1   a      10
2   a      20
3   b      100
4   b      200
Run Code Online (Sandbox Code Playgroud)

id  group  value  grp.mean.values
1   a      10     15
2   a      20     15
3   b      100    150
4   b      200    150
Run Code Online (Sandbox Code Playgroud)

Hen*_*ico 20

看看这个ave功能.就像是

df$grp.mean.values <- ave(df$value, df$group)
Run Code Online (Sandbox Code Playgroud)

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

df$grp.min <- ave(df$value, df$group, FUN = min)
Run Code Online (Sandbox Code Playgroud)


Hen*_*rik 19

你可以这样做dplyr使用mutate:

library(dplyr)
df %>%
  group_by(group) %>%
  mutate(grp.mean.values = mean(value))
Run Code Online (Sandbox Code Playgroud)

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

library(data.table)
setDT(df)[ , grp.mean.values := mean(value), by = group]
Run Code Online (Sandbox Code Playgroud)


Cha*_*ase 7

一种选择是使用plyr.ddply期望a data.frame(第一个d)并返回a data.frame(第二个d).其他XXply函数以类似的方式工作; 即ldply期望a list并返回a data.frame,dlply反之亦然......依此类推.第二个参数是分组变量.第三个参数是我们想要为每个组计算的函数.

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
Run Code Online (Sandbox Code Playgroud)