我有一个数据帧" 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 }
}}
答案 0 :(得分:0)
我首先会像这样制作列的标识符:
cols <- seq(6 ,(ncol(nsd)-2))
set1 <- which(cols %% 5 == 0)
然后使用它来索引data.frame
并执行操作:
nsd[,cols[set1]] <- nsd[,cols[set1]-1]
等...
使用此概念,您应该能够对所有操作进行矢量化。