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

如何在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 in FUN():
! non-numeric argument to binary operator

我曾尝试用data.matrix将列表转为数值形式,但报错:"dims [product 66] do not match the length of object [474928]"。请问该如何解决此问题?


解决方案

问题核心是aggregate返回的是仅包含受试者统计量的小表,无法直接和原表逐行数据匹配对比。用dplyr的分组处理可以直接完成需求,步骤如下:

  1. 按subject分组,计算每个受试者的反应时均值、标准差
  2. 基于分组统计量生成可接受的反应时范围(均值±3标准差)
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:57:36