R功能
与多列xts一起使用时,XTS ::: na.locf.xts
非常慢。 在na.locf.xts的代码中确实有一个循环 我试图找到一种方法来避免这种循环。
有什么想法吗?
答案 0 :(得分:2)
na.locf.xts
中的循环很慢,因为它为对象中的每个列创建了整个对象的副本。循环本身并不慢; [.xts
创建的副本很慢。
在R-Forge上有一个na.locf.xts
的实验(因此未导出)版本,它将循环从列移到C,这避免了复制对象。对于非常大的物体来说,速度要快得多。
set.seed(21)
m <- replicate(20, rnorm(1e6))
is.na(m) <- sample(length(x), 1e5)
x <- xts(m, Sys.time()-1e6:1)
y <- x[1:1e5,1:3]
> # smaller objects
> system.time(a <- na.locf(y))
user system elapsed
0.008 0.000 0.008
> system.time(b <- xts:::.na.locf.xts(y))
user system elapsed
0.000 0.000 0.003
> identical(a,b)
[1] TRUE
> # larger objects
> system.time(a <- na.locf(x))
user system elapsed
1.620 1.420 3.064
> system.time(b <- xts:::.na.locf.xts(x))
user system elapsed
0.124 0.092 0.220
> identical(a,b)
[1] TRUE
答案 1 :(得分:1)
timeIndex <- index(x)
x <- apply(x, 2, na.locf)
x <- as.xts(x, order.by = timeIndex)
这可以避免逐列数据复制。如果没有这个,当填充第n列时,你复制1:(n - 1)列并将第n列附加到它,当n很大时,这会变得非常慢。