我有一个由三列组成的数据帧: ID、试验和差异度量(diff_DT)。我有19个参与者,每个人都完成了30次试验。下面是我的数据帧的样子:
ID Trial diff_DT
01 005 37,5
01 006 40,5
01 007 16,5
... ... ...
02 005 16,5
... ... ...
02 016 27,930个试验中始终有6个属于一个区块:区块1:试验5-10,区块2:试验16-21,区块3:试验26-31,区块4:试验36-41,区块5:试验46-51 (注:试验数量> 30,因为参与者总共完成了更多试验)
现在,我需要每个块的每个参与者的变量diff_DT的平均值,结果是每个参与者的五个平均值。我不知道该怎么做才好。谢谢你的建议!
发布于 2017-05-11 23:43:54
您可以为块/试验创建单独的关键数据帧或矩阵,将其合并到原始表中,然后运行聚合以获得平均分数。
ID <- c(rep(1, 3), 2, 2)
Trial <- c(5, 6, 7, 5, 16)
diff_DT <- c(37.5, 40.5, 16.5, 16.5, 27.9)
Trial.key <- c(5:10, 16:21, 26:31, 36:41, 46:51)
block <- rep(1:5, each = 6)
df <- data.frame(ID, Trial, diff_DT)
blocks <- data.frame(Trial.key, block)
df.blocks <- merge(df, blocks, by.x = "Trial", by.y = "Trial.key", all.x = TRUE,
all.y = FALSE)
df.blocks
# Trial ID diff_DT block
# 5 1 37.5 1
# 5 2 16.5 1
# 6 1 40.5 1
# 7 1 16.5 1
# 16 2 27.9 2
df.agg <- with(df.blocks, aggregate(diff_DT, by = list(ID, Trial),
FUN = "mean"))
names(df.agg) <- c("ID", "Trial", "mean.diff_DT")
df.agg
# ID Trial mean.diff_DT
# 1 5 37.5
# 2 5 16.5
# 1 6 40.5
# 1 7 16.5
# 2 16 27.9发布于 2017-05-11 23:34:40
看看这对你有没有帮助。
bd <- data.frame(ID = rep(1:6, each = 30),
Trial = c(sample(c(5:10,16:21,26:31,36:41,46:51), 30),
sample(c(5:10,16:21,26:31,36:41,46:51), 30),
sample(c(5:10,16:21,26:31,36:41,46:51), 30),
sample(c(5:10,16:21,26:31,36:41,46:51), 30),
sample(c(5:10,16:21,26:31,36:41,46:51), 30),
sample(c(5:10,16:21,26:31,36:41,46:51), 30)),
diff_DT = rnorm(n = 180, mean = 30, sd = 2))
library(dplyr)
bd <- bd %>%
mutate(block = ifelse(Trial <= 10, 1,
ifelse(Trial <= 21, 2,
ifelse(Trial <= 31, 3,
ifelse(Trial <= 41, 4, 5)))))
bd %>%
group_by(ID, block) %>%
summarise(Mean = mean(diff_DT))发布于 2017-05-11 23:41:14
如果只想使用基数R,一种方法是在数据帧中创建一个列block,然后对每个块中的每个参与者应用mean函数。如果试验是数字的(考虑到您的试验是001,002,情况可能不是这样),您可以
df$block = ifelse(df$trial>=5 & df$trial <=10, 1,
ifelse(df$trial>=16 & df$trial <=21,2,
ifelse(df$trial>=26 & df$trial <=31,3,
ifelse(df$trial>=36 & df$trial <=41,4,
ifelse(df$trial>=46 & df$trial <=51,5,0))))
)如果试验不是数字(例如,字符或因子),则应首先使用
df$trial = as.numeric(as.character(df$trial))然后你只需要
aggregate(df$trial, by=list(df$block,df$id), mean)https://stackoverflow.com/questions/43919182
复制相似问题