如何避免多个for循环

时间:2016-10-25 13:03:53

标签: r for-loop

我有一个数据帧" nsd"它有175180行和301列。我的前6列填充了数据,然后填充(2k + 1)[k> = 5]中的列并且其余为空。空列将根据将填充for循环运行的列中的值进行填充。

因为,对于每一列,它将是一个元素明智的比较,我使用两个for循环,内部一个遍历所有列,外部一个遍历所有行。这需要无限的时间来运行。我该如何优化呢?

我尝试从我的代码中删除外部for循环和j元素,但是它只是比较长度为1的向量,我无法进行元素明智的比较。以下是我的代码:

for (j in 1:175180) {
    for (i in 6:(ncol(nsd)-2)) {
       if ((i-1)%%5==0) {nsd[j,i]<-nsd[j,i]}
       else if ((i-2)%%5==0) {nsd[j,i]<-nsd[j,i-1]}
       else if ( (i-3)%%5==0 & nsd[j,i-1]>0  &  nsd[j,i-1] >= nsd[j,i-3] ) {nsd[j,i] <- nsd[j,i-1] - nsd[j,i-3]}
       else if ((i-3)%%5==0 & nsd[j,i-1]>=0  &  nsd[j,i-1]<nsd[j,i-3]) {nsd[j,i]<- 0}
       else if ((i-4)%%5==0 & nsd[j,i+2]>=(nsd[j,i-1]+nsd[j,i-4])) {nsd[j,i]<- nsd[j,i-1]+nsd[j,i-4]}
       else if ((i-4)%%5==0 & nsd[j,i+2]<(nsd[j,i-1]+nsd[j,i-4])) {nsd[j,i]<- nsd[j,i+2]}
       else if ((i-5)%%5==0 & (nsd[j,i-2] + nsd[j,i-5]) > nsd[j, i-1]) {nsd[j,i]<- nsd[j,i-2] + nsd[j,i-5] - nsd[j, i-1] }
       else if ((i-5)%%5==0 & (nsd[j,i-2] + nsd[j,i-5]) <= nsd[j, i-1]) {nsd[j,i]<- 0 }
   }}

1 个答案:

答案 0 :(得分:0)

我首先会像这样制作列的标识符:

cols <- seq(6 ,(ncol(nsd)-2))
set1 <- which(cols %% 5 == 0)

然后使用它来索引data.frame并执行操作:

nsd[,cols[set1]] <- nsd[,cols[set1]-1]

等...

使用此概念,您应该能够对所有操作进行矢量化。