替换大数据中的异常值

问题描述 投票:0回答:1

我有一个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 循环会花费很多时间,如果没有更好的硬件或集群,我可以更快地做到这一点吗?

r performance optimization bigdata outliers
1个回答
2
投票

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

无论如何,在不诉诸

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 
© www.soinside.com 2019 - 2024. All rights reserved.