如何基于个体均值与标准差筛选反应时数据(R语言)
问题描述
- 本人编码经验不多,每个被试有90条反应时数据,部分数据因被试动机或注意力不足数值偏高
- 需要基于被试自身的均值(mean)和标准差(SD),筛选出偏离均值±2SD的行(或保留符合该范围的行)
- 已通过
mutate为单个被试的DataFrame(d1)添加mean和SD列,反应时列名为Reaction.time - 尝试的错误代码:
print(d1$(Reaction.time < mean+2*SD))
解决办法
你这段代码语法有误,R里筛选DataFrame行得用方括号[]或者dplyr的filter()函数,以下是两种可行方案:
方案1:基础R语法筛选
直接用逻辑条件筛选符合范围的数据:
# 保留在均值±2SD范围内的行 d1_filtered <- d1[d1$Reaction.time >= (d1$mean - 2*d1$SD) & d1$Reaction.time <= (d1$mean + 2*d1$SD), ] # 若要筛选超出范围的异常值,反转条件即可 d1_outliers <- d1[d1$Reaction.time < (d1$mean - 2*d1$SD) | d1$Reaction.time > (d1$mean + 2*d1$SD), ]
方案2:用dplyr的filter函数(更简洁)
既然你已经在用mutate(属于dplyr包),用filter()会更顺手:
library(dplyr) # 保留在均值±2SD内的行 d1_filtered <- d1 %>% filter(Reaction.time >= mean - 2*SD, Reaction.time <= mean + 2*SD) # 筛选超出范围的异常值 d1_outliers <- d1 %>% filter(Reaction.time < mean - 2*SD | Reaction.time > mean + 2*SD)
额外提醒:因为你已经用mutate给每行都加了mean和SD(单个被试的这两个值其实是相同的),所以上述代码可以正常运行。如果之后要批量处理多个被试的数据,记得先用group_by(被试ID)分组,再结合mutate和filter,就能一次性完成所有被试的异常值筛选。
内容的提问来源于stack exchange,提问作者Rolo
相关产品推荐
相关产品推荐

