【问题标题】:Add a column of group averages in R [duplicate]在R中添加一列组平均值[重复]
【发布时间】:2015-02-02 12:38:46
【问题描述】:

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

但是,这确实很慢,尤其是对于非常大的数据集。有没有更有效的方法来做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个data.table 方法,通过“ID”查找平均“年龄”

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

    【讨论】:

      【解决方案2】:

      你也可以使用 plyr

      library(plyr)
      x <- ddply(df,.(ID),summarise,ave=mean(age))
      #same as (I think):
      x <- ddply(df,~ID,summarise,meanage=mean(age))
      

      如果您希望重复平均值(如您的示例中所示),您可以将新结果合并到它上面(可能有一种方法可以避免该步骤)。

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 2021-03-27
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2013-04-01
        • 2021-02-01
        • 1970-01-01
        相关资源
        最近更新 更多