簡體   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