【问题标题】:Removing outliers easily in R在 R 中轻松去除异常值
【发布时间】:2013-03-01 14:47:39
【问题描述】:

我有离散 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 多,因此应该删除数据点。

【问题讨论】:

    标签: r standard-deviation


    【解决方案1】:

    对我来说,你想要类似的东西:

     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,然后我使用do.call调用rbind

       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,]})
    

    【讨论】:

    • 应该是z$y &lt; mean(z$y) + 2*sd(z$y) 吗?当 OP 提到“y 值比该 bin 的平均值高 2 个标准差”时
    • @liuminzhao 我更新了我的答案。我认为我的错误来自问题表述(我需要提高我的英语:))
    • 编辑后的结果和James的tapply-based James的解决方案一样
    • 然后我怎样才能把它恢复成 x 和 y 结构? (x 和 y 值列表)
    • @agstudy plyr 解决方案是否仅删除 2 SD 以上的观察结果?还是上下 2 SD?
    【解决方案2】:

    这样的?

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

    或者你的意思是这样的?

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

    【讨论】:

    • 此解决方案不会按 bin 删除 y 中的异常值(分别针对 x 的每个值),而是在全球范围内删除异常值
    【解决方案3】:

    您可以为此使用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
    

    【讨论】:

    • 那我怎样才能把它重组成一个 x 和 y 值的列表呢?
    猜你喜欢
    • 2012-05-21
    • 2020-04-07
    • 2016-07-01
    • 2015-07-13
    • 2015-03-11
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多