【问题标题】:Calculate the mean per subject and repeat the value for each subject's row计算每个主题的平均值并为每个主题的行重复该值
【发布时间】:2016-04-02 19:40:26
【问题描述】:

这是我第一次提出关于堆栈溢出的问题。我已经尝试寻找答案,但我找不到我正在寻找的确切内容。我希望有人可以提供帮助。

我有一个庞大的 20416 观察数据集。基本上,我有 83 个科目,对于每个科目,我都有几个观察结果。但是,每个受试者的观察次数并不相同(例如受试者 1 有 256 个观察,而受试者 2 只有 64 个观察)。 我想添加一个额外的列,其中包含每个主题的观察平均值(观察结果是阅读时间 (RT))。

我尝试了聚合函数:

aggregate (RT ~ su, data, mean)

此公式返回每个受试者的正确平均值。但是我不能简单地执行以下操作:

data$mean <- aggregate (RT ~ su, data, mean)

因为 R 返回此错误:

$tmp, "mean", value = list(su = 1:83, RT) 中的错误 = c(378.1328125, : 替换有83行,数据有20416

我知道该公式缺少一个命令,该命令指定每个主题的平均值必须针对所有主题的行重复(例如,如果主题 1 有 256 行,则主题 1 的平均值必须重复 256 行,如果主题 2 有 64 行,主题 2 的平均值必须重复 64 行,依此类推)。

如何在 R 中实现这一点?

【问题讨论】:

  • 当你说为每个主题添加一个额外的 row 包含的意思时,你的意思是一个额外的 column
  • 对,我的意思是多出一列,抱歉。

标签: r aggregate mean


【解决方案1】:

data.table 语法很适合这类问题:

Dt[, Mean := mean(Value), by = "ID"][]
#     ID       Value        Mean
# 1:   a  0.05881156 0.004426491
# 2:   a -0.04995858 0.004426491
# 3:   b  0.64054432 0.038809830
# 4:   b -0.56292466 0.038809830
# 5:   c  0.44254622 0.099747707
# 6:   c -0.10771992 0.099747707
# 7:   c -0.03558318 0.099747707
# 8:   d  0.56727423 0.532377247
# 9:   d -0.60962095 0.532377247
# 10:  d  1.13808538 0.532377247
# 11:  d  1.03377033 0.532377247
# 12:  e  1.38789640 0.568760936
# 13:  e -0.57420308 0.568760936
# 14:  e  0.89258949 0.568760936

当我们应用分组操作 (by = "ID") 时,data.table 将自动复制每个组的 mean(Value) 适当的次数(避免您在上面遇到的错误)。


数据:

Dt <- data.table::data.table(
  ID = sample(letters[1:5], size = 14, replace = TRUE),
  Value = rnorm(14))[order(ID)]

【讨论】:

    【解决方案2】:

    留在 Base R 中,ave 用于此用途:

    data$mean = with(data, ave(x = RT, su, FUN = mean))
    

    【讨论】:

      【解决方案3】:

      只需merge您的聚合意味着数据与主题连接的完整数据框:

      aggdf <- aggregate (RT ~ su, data, mean)
      
      names(aggdf)[2] <- "MeanOfRT"
      df <- merge(df, aggdf, by="su")
      

      【讨论】:

        【解决方案4】:

        在不生成额外数据对象的情况下处理此问题的另一种引人注目的方法是使用 group_bydplyr 包:

        # Generating some data
        data <- data.table::data.table(
             su = sample(letters[1:5], size = 14, replace = TRUE),
             RT = rnorm(14))[order(su)]
        
        # Performing
        > data %>% group_by(su) %>% 
        +     mutate(Mean = mean(RT)) %>%
        +     ungroup() 
        Source: local data table [14 x 3]
        
           su          RT       Mean
        1   a -1.62841746  0.2096967
        2   a  0.07286149  0.2096967
        3   a  0.02429030  0.2096967
        4   a  0.98882343  0.2096967
        5   a  0.95407214  0.2096967
        6   a  1.18823435  0.2096967
        7   a -0.13198711  0.2096967
        8   b -0.34897914  0.1469982
        9   b  0.64297557  0.1469982
        10  c -0.58995261 -0.5899526
        11  d -0.95995198  0.3067978
        12  d  1.57354754  0.3067978
        13  e  0.43071258  0.2462978
        14  e  0.06188307  0.2462978 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-23
          相关资源
          最近更新 更多