如何按id分组计算多列反应时(RT)的总体均值?
按ID分组计算所有RT列的总体均值并添加到原数据框
我有一个包含多名参与者反应时(RT)列的数据框(实际共20个RT列),简化版数据如下:
df <- data.frame( id=c(1,1,1,5,5,5), RT_0=c(0.467,NA,0.634,0.416,NA,0.35), RT_1=c(0.3,0.35,0.301,0.267,0.3,0.449), RT_2=c(1.251,NA, 0.334,0.34, 0.317,0.42), RT_3=c(0.284,0.316,0.283,0.367,0.55,0.35), pos=c(1,6,2,4,2,6) )
数据预览:
id RT_0 RT_1 RT_2 RT_3 pos 1 0.467 0.3 1.251 0.284 1 1 NA 0.35 NA 0.316 6 1 0.634 0.301 0.334 0.283 2 5 0.416 0.267 0.34 0.367 4 5 NA 0.3 0.317 0.55 2 5 0.35 0.449 0.42 0.35 6
需求
按id分组,计算该参与者所有RT列的总体均值(忽略NA),并将这个均值添加到原数据框的对应行中。最终期望结果如下:
id RT_0 RT_1 RT_2 RT_3 pos mean 1 0.467 0.3 1.251 0.284 1 0.452 1 NA 0.35 NA 0.316 6 0.452 1 0.634 0.301 0.334 0.283 2 0.452 5 0.416 0.267 0.34 0.367 4 0.375 5 NA 0.3 0.317 0.55 2 0.375 5 0.35 0.449 0.42 0.35 6 0.375
解决方案
方法1:基础R实现
无需额外包,自动识别所有RT列:
# 筛选所有以RT_开头的列 rt_cols <- grep("^RT_", names(df), value = TRUE) # 按id分组计算总体均值(忽略NA) id_mean <- aggregate( x = df[rt_cols], by = list(id = df$id), FUN = function(x) mean(x, na.rm = TRUE) ) names(id_mean)[2] <- "mean" # 合并回原数据框并保持原行顺序 df_result <- merge(df, id_mean, by = "id") df_result <- df_result[match(df$id, df_result$id), ] row.names(df_result) <- NULL
方法2:tidyverse实现(推荐,更简洁)
利用dplyr的管道语法,适合处理大量列的场景:
library(dplyr) df_result <- df %>% group_by(id) %>% # 对所有以RT_开头的列计算均值 mutate(mean = mean(c_across(starts_with("RT_")), na.rm = TRUE)) %>% ungroup()
两种方法都能自动适配20个RT列的实际数据,无需手动指定每一列。
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

