替换大数据中的异常值
Replace outliers from big data
我有一个包含 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 循环会花费很多时间,如果没有更好的硬件或集群,我可以更快地执行此操作吗?
有几种优化功能的方法,但正如您的问题所表明的那样,操作并不慢。
无论如何,不用求助于 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
我有一个包含 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 循环会花费很多时间,如果没有更好的硬件或集群,我可以更快地执行此操作吗?
有几种优化功能的方法,但正如您的问题所表明的那样,操作并不慢。
无论如何,不用求助于 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