在这个(组成的)数据框df中,我想显示按ID分组的平均年龄。
立即输出:
ID age
1 20
1 25
20 40
20 35
20 30
356 27
4001 22
4001 49
4001 46
4001 75
55555 50
55555 54
期望的输出:
ID age meanage
1 20 22.5
1 25 22.5
20 40 35.0
20 35 35.0
20 30 35.0
356 27 27.0
4001 22 48.0
4001 49 48.0
4001 46 48.0
4001 75 48.0
55555 50 52.0
55555 54 52.0
一个有效的解决方案是
for (i in min(df$ID):max(df$ID))
{
df$meanage[df$ID == i] <- mean(df$age[df$ID == i])
}
但是,这非常慢,特别是对于非常大的数据集。有没有更有效的方法来做到这一点?
答案 0 :(得分:2)
以下是使用“ID”
查找平均“年龄”的data.table
方法
library(data.table)
setDT(df)[,meanage:=mean(age) , by = ID][]
或base R
方法
df$meanage <- with(df, ave(age, ID))
或使用dplyr
(由@David Arenburg提供)
library(dplyr)
df %>%
group_by(ID) %>%
mutate(meanage = mean(age))
答案 1 :(得分:0)
你也可以使用plyr
library(plyr)
x <- ddply(df,.(ID),summarise,ave=mean(age))
#same as (I think):
x <- ddply(df,~ID,summarise,meanage=mean(age))
如果你想要平均重复(如你的例子中),你可以将新结果合并到它上(可能有办法避免这一步)。