我正在尝试使用循环根据每行第一列中的值来平衡数据行。下面只是一个示例,最终我想根据较大数据集中各列的最大值和最小值运行与此类似的操作。
如果第一列是低于11的数字,我想稍微增加它,并将第二列和第三列减少相应的值。我还想说明是否有任何 V1 值高于特定水平。
我尝试了各种代码,要么收到有关长度> 1的条件的警告消息,要么立即实现中断子句。请参阅下面的代码。
mat <- matrix(data = seq(10, 21, by=1), nrow = 6, ncol =3 )
mat <- as.data.frame(mat)
continue <- TRUE
while(continue) {
for(i in 1:nrow(mat)) {
if(mat[i,1] > 12) {
mat[i, "V1"] <- "high"
} else if (mat[i,1] < 11) {
mat[i, "V1"] <- mat$V1[i] + 0.1;
mat[i, "V2"] <- mat$V2[i] - 0.03;
mat[i, "V3"] <- mat$V3[i] - 0.07
print(paste("V1", mat$V1))
} else if (mat[i,1] > 11) {
continue <- FALSE
}
}
}
我假设最后的 else if 语句正在检查第一列中的所有 值,因此看到条件已得到满足。但是我希望代码继续迭代,直到每一行都满足条件。
最佳答案
假设第一列距离 11 不太远,这段代码应该可以在大型数据集上正常工作。 还可以计算出每一行需要多少个循环,并一步完成。如果速度是一个潜在的问题,我将改进我的代码来做到这一点。
mat <- matrix(data = seq(10, 21, by=1), nrow = 6, ncol =3 )
while(!all(mat[,1] > 11)) {
toolow=mat[,1]<=11
mat[toolow,1] <- mat[toolow,1] + 0.01
mat[toolow,2] <- mat[toolow,2] - 0.03
mat[toolow,3] <- mat[toolow,3] - 0.07
}
## We unfortunately get some floating point error.
mat = round(mat, 3)
mat = apply(mat,2,as.character)
mat[as.numeric(mat[,1])>12,1]="high"
mat
关于r - 努力让 while 语句继续迭代 R 中的每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58994051/