我想计算mean
(或长度为1的任何其他摘要统计信息,例如min
,max
,length
,sum
)变量(“值”)在分组变量(“组”)的每个级别内。
应将摘要统计信息分配给与原始数据具有相同长度的新变量。也就是说,原始数据的每一行都应该具有与当前组值相对应的值 - 数据集不应该折叠为每组一行。例如,请考虑组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
答案 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)
一种选择是使用plyr
。 ddply
需要data.frame
(第一个d)并返回data.frame
(第二个d)。其他XXply函数以类似的方式工作;即ldply
期望list
并返回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
答案 3 :(得分: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