在R中添加一组组平均值

时间:2015-02-02 12:38:47

标签: r

在这个(组成的)数据框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])
}

但是,这非常慢,特别是对于非常大的数据集。有没有更有效的方法来做到这一点?

2 个答案:

答案 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))

如果你想要平均重复(如你的例子中),你可以将新结果合并到它上(可能有办法避免这一步)。