【问题标题】:replacement for na.locf.xts (extremely slow when used with a multicolumn xts)替换 na.locf.xts(与多列 xts 一起使用时非常慢)
【发布时间】:2014-03-25 12:51:57
【问题描述】:

R 函数

xts:::na.locf.xts

与多于几列的多列 xts 一起使用时非常慢。 na.locf.xts 的代码中的列确实存在循环
我试图找到一种方法来避免这个循环。

有什么想法吗?

【问题讨论】:

  • 为什么没有循环?您是(错误地)认为 for 循环很慢的众多人中的一员吗?

标签: r loops xts


【解决方案1】:

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

【讨论】:

【解决方案2】:
timeIndex <- index(x)
x <- apply(x, 2, na.locf)
x <- as.xts(x, order.by = timeIndex)

这避免了逐列数据的复制。如果没有这个,在填充第 n 列时,您会复制 1 : (n - 1) 列并将第 n 列附加到其中,当 n 很大时,这会变得非常慢。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多