如何在R中为每个受试者单独筛选反应时(RTs)
问题:按受试者筛选反应时(剔除均值±3标准差数据)
我需要筛选反应时(RTs),剔除每个受试者反应时中超出均值±3标准差的数据。我使用aggregate函数获取了每位受试者的均值和标准差:
aggregate(DB$rt, list(DB$subject), FUN=mean) aggregate(DB$rt, list(DB$subject), FUN=sd)
但由于返回结果是汇总表,当我尝试用以下代码筛选时:
DB_r <- DB %>% filter(rt < aggregate(DB$rt, list(DB$subject), FUN=mean)+3*aggregate(DB$rt, list(DB$subject), FUN=sd))
出现了如下错误:
Error in
filter():
! Problem while computing..1 = rt < ....
Caused by error inFUN():
! non-numeric argument to binary operator
我曾尝试用data.matrix将列表转为数值形式,但报错:"dims [product 66] do not match the length of object [474928]"。请问该如何解决此问题?
解决方案
问题核心是aggregate返回的是仅包含受试者统计量的小表,无法直接和原表逐行数据匹配对比。用dplyr的分组处理可以直接完成需求,步骤如下:
- 按
subject分组,计算每个受试者的反应时均值、标准差 - 基于分组统计量生成可接受的反应时范围(均值±3标准差)
- 筛选出在范围内的数据
完整代码
library(dplyr) DB_r <- DB %>% group_by(subject) %>% mutate( rt_mean = mean(rt, na.rm = TRUE), # 计算每组均值,na.rm处理缺失值 rt_sd = sd(rt, na.rm = TRUE), # 计算每组标准差 lower_bound = rt_mean - 3 * rt_sd, upper_bound = rt_mean + 3 * rt_sd ) %>% filter(rt >= lower_bound & rt <= upper_bound) %>% ungroup() # 取消分组,恢复普通数据框格式
补充说明
group_by(subject):将数据按受试者分组,后续统计量均基于单组计算mutate:在原表中新增列存储分组统计量和范围边界,让每行数据都能匹配到所属受试者的判断标准- 若不需要保留新增的统计量列,可在筛选后移除:
DB_r <- DB %>% group_by(subject) %>% mutate( rt_mean = mean(rt, na.rm = TRUE), rt_sd = sd(rt, na.rm = TRUE), lower_bound = rt_mean - 3 * rt_sd, upper_bound = rt_mean + 3 * rt_sd ) %>% filter(rt >= lower_bound & rt <= upper_bound) %>% select(-rt_mean, -rt_sd, -lower_bound, -upper_bound) %>% ungroup()
内容的提问来源于stack exchange,提问作者CG96
相关产品推荐
相关产品推荐

