更换na.locf.xts(与多列xts一起使用时速度极慢)

时间:2014-02-24 02:36:42

标签: r loops xts

R功能

  

XTS ::: na.locf.xts

与多列xts一起使用时,

非常慢。 在na.locf.xts的代码中确实有一个循环 我试图找到一种方法来避免这种循环。

有什么想法吗?

2 个答案:

答案 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很大时,这会变得非常慢。