繁体   English   中英

在 R 如何使 for 循环运行得更快?

[英]In R how can I make the for loop run faster?

我有以下代码,属于 2 个时间序列。 maxNo 是时间序列中的元素数。 longStopPrev 是 longStop 的 1 position 滞后版本。 变量在循环之前启动,因此它们的大小不会在每次迭代中增加。 当 maxNo 很大时,这个循环需要很长时间才能运行。

有没有什么聪明的方法可以避免使用 for 循环和矢量化或让它运行得更快?

我认为主要的挑战是变量longStopPrev在循环的每次运行中都有可能发生变化,这使得仅将操作作为向量运行一次变得很困难。 然而,可能有更好的执行方式,类似于不同的搜索算法。

我已经使用foreach进行了测试,但它只会使代码运行速度变慢。 我还测试了在 for 循环中的更改

longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1 

和:

longStopPrev[i+1] <- longStop[i]

但结果稍微慢了一点。

我试图在下面制作一个可重现的示例。 我在我的时间序列中用 ~10.000 点测试代码,并且实际上希望以 ~100.000 或更长的时间运行。

require("xts")

set.seed(47); n = 1e1;
data <- xts(rnorm(n)+10, 
             order.by = seq(as.POSIXct("2017-05-31 17:00:00"), length=n, by="min"))

diff=0.5
longStop = data - diff

longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1
longStopPrev = na.approx(longStopPrev, rule=2,na.rm = FALSE,maxgap=1) # fill NA values by approx

maxNo <- nrow(longStop)

for(i in 1:maxNo) {
  if(as.numeric(data[i])>as.numeric(longStopPrev[i]) ){
    longStop[i] <- max(longStop[i],longStopPrev[i])
    longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1 
    
  }
}
longStopPrev = na.approx(longStopPrev, rule=2,na.rm = FALSE,maxgap=1) # fill NA values by approx

我发现在 for 循环之前使用coredata()xts转换为matrix可以大大加快代码速度。 与矩阵相比,显然调用 xts 元素要慢得多。 在 for 循环结束时,如果需要,您可以将其转换回xts

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM