在 r 中重复循环,直到一列中的值小于其他几列

Repeat loop in r until the values in one column are less than several other columns

我有一个数据集 df,其中最后一列 (value) 包含采样值。在同一数据集中,我还有其他几列(rep1:rep4),其值需要小于同一行中的采样值。如果不满足此条件,我需要对 value 列重新采样并重试。这需要重复,直到 rep1:rep4 中的数字小于 value 列中的相应数字。

我仍在尝试处理循环,但似乎 while 循环可能是此处使用的内容。


    ID  rep1  rep2  rep3  rep4  value
1   a   NA    NA    NA    NA    -400
2   b   -400  NA    NA    NA    -300
3   c   -400  -300  NA    NA    -200
4   d   -400  -300  -200  NA    -300
5   e   -400  -300  -200  -300  -400
6   f   NA    NA    NA    NA    -400
7   g   -400  NA    NA    NA    -400
8   h   NA    NA    NA    NA    -400
9   i   NA    NA    NA    NA    -200
10  j   -200  -300  NA    NA    -300
11  k   -300  NA    NA    NA    -200
12  l   NA    NA    NA    NA    -300
13  m   NA    NA    NA    NA    -300
structure(list(ID = structure(1:13, .Label = c("a", "b", "c", 
"d", "e", "f", "g", "h", "i", "j", "k", "l", "m"), class = "factor"), 
    rep1 = c(NA, -400L, -400L, -400L, -400L, NA, -400L, NA, NA, 
    -200L, -300L, NA, NA), rep2 = c(NA, NA, -300L, -300L, -300L, 
    NA, NA, NA, NA, -300L, NA, NA, NA), rep3 = c(NA, NA, NA, 
    -200L, -200L, NA, NA, NA, NA, NA, NA, NA, NA), rep4 = c(NA, 
    NA, NA, NA, -300L, NA, NA, NA, NA, NA, NA, NA, NA), value = c(-400L, 
    -300L, -200L, -300L, -400L, -400L, -400L, -400L, -200L, -300L, 
    -200L, -300L, -300L)), class = "data.frame", row.names = c(NA, 
-13L))

这是我的开始:

while(df$value < df$rep1:df$rep4) { repeat sampling process }

抽样过程是一个多步骤过程,必要时我可以包括在内,但可能会使事情过于复杂。根据我对循环的有限理解,如果我遵循 while 的条件 满足我的预期结果,它将继续循环(在我的例子中是重新采样)直到value 列每一行的重采样数据都大于 rep1rep4 列中的值。

这带来了几个错误(不足为奇):一个 NA/NaN 参数,以及几个错误,指出尽管 df$rep1:df$rep4 的数值表达式有多个元素,但只使用了第一个。

对于 NA/NaN 参数,我猜测问题是不是所有的 rep 列行都被填充,因此无法将值与 value 列中的值进行比较。对于只使用第一个元素的问题,我不确定那是因为 NA/Nan 破坏了东西,所以它无法继续,或者代码是否需要指定检查所有行。

预期的输出是数据帧本身。如果它通过循环要求,则数据帧将有效,我可以继续使用该数据。

假设您将 NA 视为 0。

df[is.na(df)]<-0
while(any(df[,2]:df[,5]) > df[,6]){
  df[,6]<-sample(df[,6])
}

假设 1)我们在计算中忽略了 NA 2)采样过程是当值不是最高值时加100

for (i in 1:nrow(df)){
  while (any(df$value[i]<=as.numeric(df[i,2:5])%>%na.omit())){
    df$value[i]=df$value[i]+100} #Here you should replace with your sampling process
}

> df
   ID rep1 rep2 rep3 rep4 value
1   a   NA   NA   NA   NA  -400
2   b -400   NA   NA   NA  -300
3   c -400 -300   NA   NA  -200
4   d -400 -300 -200   NA  -100
5   e -400 -300 -200 -300  -100
6   f   NA   NA   NA   NA  -400
7   g -400   NA   NA   NA  -300
8   h   NA   NA   NA   NA  -400
9   i   NA   NA   NA   NA  -200
10  j -200 -300   NA   NA  -100
11  k -300   NA   NA   NA  -200
12  l   NA   NA   NA   NA  -300
13  m   NA   NA   NA   NA  -300