r - 努力让 while 语句继续迭代 R 中的每一行

标签 r while-loop

我正在尝试使用循环根据每行第一列中的值来平衡数据行。下面只是一个示例,最终我想根据较大数据集中各列的最大值和最小值运行与此类似的操作。

如果第一列是低于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/

相关文章:

r - as.matrix 不保留空 data.frame 的数据模式

R purrr::partial——它如何处理部分参数?

performance - 在 R 中将集合转换为列索引的有效方法是什么?

c - 使用 scanf 为数组中的每个值分配时间的程序 (C)

带有 if 语句的 Javascript while 循环

java - 如何将此 FOR 循环转换为 WHILE 循环,以便它也计算辅音? (Java)

r - FORECAST 包中的 STLF 函数

r - 如何合并列联矩阵的两个输入值?

c++ - 运行时错误 : RunTime Error : map/set iterators incompatible

c++ - 不确定要更改什么才能让 char break 语句