【发布时间】:2014-03-25 12:51:57
【问题描述】:
R 函数
xts:::na.locf.xts
与多于几列的多列 xts 一起使用时非常慢。
na.locf.xts 的代码中的列确实存在循环
我试图找到一种方法来避免这个循环。
有什么想法吗?
【问题讨论】:
-
为什么没有循环?您是(错误地)认为 for 循环很慢的众多人中的一员吗?
R 函数
xts:::na.locf.xts
与多于几列的多列 xts 一起使用时非常慢。
na.locf.xts 的代码中的列确实存在循环
我试图找到一种方法来避免这个循环。
有什么想法吗?
【问题讨论】:
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
【讨论】:
timeIndex <- index(x)
x <- apply(x, 2, na.locf)
x <- as.xts(x, order.by = timeIndex)
这避免了逐列数据的复制。如果没有这个,在填充第 n 列时,您会复制 1 : (n - 1) 列并将第 n 列附加到其中,当 n 很大时,这会变得非常慢。
【讨论】: