代码之家  ›  专栏  ›  技术社区  ›  augusto carillo ferrari

替换大数据中的异常值

  •  1
  • augusto carillo ferrari  · 技术社区  · 9 年前

    我有一个包含12个列和600000行的大数据,我想用这个函数替换异常值

     replace_outliers <- function(x, na.rm = TRUE, ...) {
        qnt <- quantile(x, probs=c(.25,.50 ,.75), na.rm = na.rm, ...)
        H <- 1.5 * IQR(x, na.rm = na.rm)
        y <- x
        y[x > (qnt[3] + H)] <-  qnt[2]
        y
     }
    

    但是使用for循环会花费很多时间,如果没有更好的硬件或集群,我能更快地完成这一操作吗?

    1 回复  |  直到 9 年前
        1
  •  2
  •   csgillespie Carl Witthoft    9 年前

    有几种优化功能的方法,但正如您所问的,操作并没有那么慢。

    无论如何,不用诉诸 data.table , dplyr ,或者并行编程,我们仍然可以通过简单地将函数重写为

    replace_outliers2 = function(x, na.rm = TRUE, ...) {
      qnt = quantile(x, probs=c(.25,.50 ,.75), na.rm = na.rm, ...)
      x[x > (2.5*qnt[3]- 1.5*qnt[1])] = qnt[2]
      x
    }
    

    一些快速计时:

    R> x = matrix(rlnorm(600000*12), ncol=12)
    R> system.time({for(i in 1:12) replace_outliers(x[,i])})
       user  system elapsed 
      1.448   0.008   1.469 
    R> system.time({ for(i in 1:12) replace_outliers2(x[,i])})
       user  system elapsed 
      0.860   0.004   0.869