首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建具有多行均值的新数据框

创建具有多行均值的新数据框
EN

Stack Overflow用户
提问于 2017-05-11 23:03:47
回答 5查看 2.4K关注 0票数 0

我有一个由三列组成的数据帧: ID、试验和差异度量(diff_DT)。我有19个参与者,每个人都完成了30次试验。下面是我的数据帧的样子:

代码语言:javascript
复制
    ID     Trial     diff_DT
    01      005       37,5
    01      006       40,5
    01      007       16,5
    ...     ...       ...
    02      005       16,5 
    ...     ...       ...
    02      016       27,9

30个试验中始终有6个属于一个区块:区块1:试验5-10,区块2:试验16-21,区块3:试验26-31,区块4:试验36-41,区块5:试验46-51 (注:试验数量> 30,因为参与者总共完成了更多试验)

现在,我需要每个块的每个参与者的变量diff_DT的平均值,结果是每个参与者的五个平均值。我不知道该怎么做才好。谢谢你的建议!

EN

回答 5

Stack Overflow用户

发布于 2017-05-11 23:43:54

您可以为块/试验创建单独的关键数据帧或矩阵,将其合并到原始表中,然后运行聚合以获得平均分数。

代码语言:javascript
复制
 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
票数 1
EN

Stack Overflow用户

发布于 2017-05-11 23:34:40

看看这对你有没有帮助。

代码语言:javascript
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2017-05-11 23:41:14

如果只想使用基数R,一种方法是在数据帧中创建一个列block,然后对每个块中的每个参与者应用mean函数。如果试验是数字的(考虑到您的试验是001,002,情况可能不是这样),您可以

代码语言:javascript
复制
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))))
           )

如果试验不是数字(例如,字符或因子),则应首先使用

代码语言:javascript
复制
df$trial = as.numeric(as.character(df$trial))

然后你只需要

代码语言:javascript
复制
aggregate(df$trial, by=list(df$block,df$id), mean)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43919182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档