计算每个主题的平均值并重复每个主题行的值

Calculate the mean per subject and repeat the value for each subject's row

第一次问栈溢出的问题。我曾尝试寻找答案,但无法准确找到我要寻找的内容。希望有人能帮忙。

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

我试过聚合函数:

aggregate (RT ~ su, data, mean)

这个公式 returns 每个科目的正确平均值。但是我不能简单地做以下事情:

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

as R returns 这个错误:

Error in $<-.data.frame(tmp, "mean", value = list(su = 1:83, RT = c(378.1328125, : replacement has 83 rows, data has 20416

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

如何在 R 中实现这一点?

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

简单地merge您的聚合意味着数据与主题加入的完整数据框:

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

names(aggdf)[2] <- "MeanOfRT"
df <- merge(df, aggdf, by="su")

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

# 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 

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

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