这是我第一次询问有关堆栈溢出的问题。我试过寻找答案,但我找不到我想要的东西。我希望有人可以提供帮助。
我有一个20416观察的庞大数据集。基本上,我有83个科目,每个科目我有几个观察。然而,每个受试者的观察数量不相同(例如,受试者1具有256个观察结果,而受试者2仅具有64个观察结果)。 我想添加一个额外的列,其中包含每个主题的观察结果(观察结果是阅读时间(RT))。
我尝试使用聚合函数:
aggregate (RT ~ su, data, mean)
此公式返回每个主题的正确平均值。但后来我不能简单地做到以下几点:
data$mean <- aggregate (RT ~ su, data, mean)
当R返回此错误时:
$&lt; - 。data.frame( tmp ,“mean”,value = list(su = 1:83,RT)出错 = c(378.1328125,:替换有83行,数据有20416
我理解该公式缺少一个命令,指定必须为所有主题行重复每个主题的平均值(例如,如果主题1有256行,则主题1的平均值必须重复256行,如果主题2有64行,主题2的平均值必须重复64行,依此类推。
我如何在R?
中实现这一目标答案 0 :(得分:6)
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)]
答案 1 :(得分:4)
住在Base R,ave
旨在用于此用途:
data$mean = with(data, ave(x = RT, su, FUN = mean))
答案 2 :(得分:1)
简单merge您的汇总表示数据与主题加入的完整数据框:
aggdf <- aggregate (RT ~ su, data, mean)
names(aggdf)[2] <- "MeanOfRT"
df <- merge(df, aggdf, by="su")
答案 3 :(得分:1)
在不生成额外数据对象的情况下处理此问题的另一种令人信服的方法是使用group_by
dplyr
个软件包:
# 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