从数据帧中删除异常值(+ -2 SD)

时间:2017-10-11 14:06:50

标签: r outliers

我有一个data.frame,包含我的所有科目(总共20个)和每个条件的反应时间(总共3个)。见下面的例子。

我想从每个主题的每个条件的平均值中删除异常值

我使用了这段代码:

dat<- do.call(rbind,by(dat,dat$condition,function(x) x[!abs(scale(x$rt_raw)) > 2,] ))

但它似乎按条件分组每一行,而不是条件和主题。 还有另一种方法吗?或者我错了吗?

rt_raw       subject    condition 

 0.9193426       1      L        
 0.7985855       1      C         
 0.7000456       1      S        
 0.8501735       2      C        
 0.715198        2      S         
 0.7865169       2      L   

提前致谢

1 个答案:

答案 0 :(得分:0)

你可以试试这个粗略的解决方案。这里的想法是为条件的平均值和标准差创建两个变量,以考虑这个&#34;每个条件的每个主题的平均值&#34;案件。 然后基于每个受试者的每个受试者的平均值来移除试验。

dat <- data.frame(rt_raw = runif(12, 1, 10),
                  subject = sort(rep(1:3, 4)),
                  condition = rep(c("L", "C", "S"), 4))

# mean and sd per condition, for each subject (each row)
dat$mean.condition <- by(dat$rt_raw, dat$condition, mean)
dat$sd.condition <- by(dat$rt_raw, dat$condition, sd)
# remove outliers 
dat2 <- dat[!(abs(dat$rt_raw - dat$mean.condition)/dat$sd.condition) > 1, ]
dat3 <- dat[!(abs(dat$rt_raw - dat$mean.condition)/dat$sd.condition) > 1.5, ]
dat4 <- dat[!(abs(dat$rt_raw - dat$mean.condition)/dat$sd.condition) > 2, ]