在R中轻松删除异常值

时间:2013-03-01 14:47:39

标签: r standard-deviation

我有包含离散x值的数据,例如

x = c(3,8,13,8,13,3,3,8,13,8,3,8,8,13,8,13,8,3,3,8,13,8,13,3,3)
y = c(4,5,4,6,7,20,1,4,6,2,6,8,2,6,7,3,2,5,7,3,2,5,7,3,2);

如何生成x和y值的新数据集,其中我消除了值对,其中y值比该bin的平均值高2个标准偏差。例如,在x = 3 bin中,20比平均值高出2 SD以上,因此应删除数据点。

3 个答案:

答案 0 :(得分:7)

对我来说你想要的东西是:

 by(dat,dat$x, function(z) z$y[z$y < 2*sd(z$y)])
dat$x: 3
[1] 4 1 6 5 7 3 2
--------------------------------------------------------------------------------------------------------------- 
dat$x: 8
[1] 4 2 2 2 3
--------------------------------------------------------------------------------------------------------------- 
dat$x: 13
[1] 3 2
评论后

编辑

 by(dat,dat$x, 
           function(z) z$y[abs(z$y-mean(z$y))< 2*sd(z$y)])

修改

我略微更改by函数以获取x和y,然后使用rbind

调用do.call
   do.call(rbind,by(dat,dat$x,function(z) {
                              idx <- abs(z$y-mean(z$y))< 2*sd(z$y)
                              z[idx,]
            }))

或在单次通话中使用plyr

 ddply(dat,.(x),function(z) {
                 idx <- abs(z$y-mean(z$y))< 2*sd(z$y)
                  z[idx,]})

答案 1 :(得分:2)

这样的东西?

newdata <- cbind(x,y)[-which(y>2*sd(y)), ]

或者你的意思是这样的?

Data <- cbind(x,y)
Data[-which(sd(y)>rowMeans(Data)), ]

答案 2 :(得分:2)

您可以使用tapply,但您将丢失原始订单。

tapply(y,x,function(z) z[abs(z-mean(z))<2*sd(z)])
$`3`
[1] 4 1 6 5 7 3 2

$`8`
 [1] 5 6 4 2 8 2 7 2 3 5

$`13`
[1] 4 7 6 6 3 2 7