2017-08-24 101 views
-1

我有一個如下所示的包含兩個循環的代碼。該代碼讀取每月流量數據並將其作爲多重複制。循環太慢了。我想知道是否有其他方法使其更快?R如何使循環更快

library(xlsx) 
library(data.table) 

    a <- read.xlsx("streamflow.xlsx",sheetName = "Sheet1", header = TRUE) 
    b=matrix(nrow=129792,ncol=17) 
    b= data.frame(b) 
    i=0 

    for (j in -11:1236) 
    { 
    for (k in 1:104) 
    { 
    i=i+1 
    j=j+12 
    j[j > 1248] <-j-1248 
    b[i,] <-a[j,] 
    } 
} 

感謝

+1

我只能看到2個循環。什麼是'data.table'在做什麼? – SymbolixAU

+1

你可以輸入(head(b))',這樣我們就可以看到數據以及循環中發生了什麼?有可能是一種矢量化方法 – csgroen

+2

另外,'dput(head(a))'。幫助我們通過給出[可重現的示例]來幫助你(https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#5963610) – csgroen

回答

0

我相信這是你的雙for循環到量化代碼的正確翻譯。它應該會顯着提高速度。此外,不需要聲明b作爲矩陣並將其轉換爲data.frame,這些值可以從a獲得。

j_iter <- -11:1236 
k_iter <- 1:104 

k <- seq(12, length(k_iter) * 12, 12) 
k <- rep(k, times=length(j_iter)) 

j <- rep(j_iter, each=length(k_iter)) 
j <- j + k 
j[j > 1248] <- j[j > 1248] - 1248 

b <- a[j,] 
+0

謝謝@dvantwisk。它似乎正在工作,而且速度非常快。 – Heerj