2017-08-24 30 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