R 3.1.2
library(RcppRoll)
我的data.frame
y=
V1 V2 V3 V4 V5 V6 V7 V8 V9
1 1 2 3 4 5 6 7 8 9
2 16 17 18 19 20 21 22 23 24
3 31 32 33 34 35 36 37 38 NA
4 46 47 48 49 50 51 52 53 54
我的职能:
sapply(y, RcppRoll::roll_mean, n = 3, na.rm = T)
我没有问题并且工作正常,但在使用我的大量数据时速度非常慢。我想知道我们如何使用多核甚至使用for循环加速sapply
的性能?
@Khashaa是的,我试过,它更快,但我的输出有问题:
输出:
>
[,1] [,2] [,3]
[1,] 16 17 18
这会导致我的其余代码出现问题,因此我希望将其更改为:
V1 V2 V3
[1,] 16 17 18
对此有什么看法?
答案 0 :(得分:3)
在此具体示例中,您不需要fragment
。只需sapply
即可
roll_mean(as.matrix(y), 3, na.rm=T)
与y <- runif(1e7)
dim(y) <- c(1e3, 1e4)
y <- data.frame(y)
system.time(sapply(y, RcppRoll::roll_mean, n = 3, na.rm = T))
# user system elapsed
# 14.120 0.451 18.960
system.time(RcppRoll::roll_mean(as.matrix(y), 3, na.rm=T))
# user system elapsed
# 0.329 0.000 0.329
# About 60x times faster
结果的唯一区别是sapply
您可以更改如下
colnames
答案 1 :(得分:1)
这样可行:
mclapply(y, roll_mean, n=3, na.rm=TRUE, mc.cores=detectCores())
或者
laply(y, .fun=roll_mean, n=3, na.rm=TRUE, .parallel=TRUE)