You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:40:22