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

时间:2019-07-13 12:50:53

标签: r loops while-loop repeat

我有一个数据集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损坏了东西,所以它无法继续,还是代码需要指定所有行都已检查。

此的预期输出是数据帧本身。如果它满足循环要求,则该数据帧将是有效的,我可以继续处理该数据。

2 个答案:

答案 0 :(得分:1)

假设 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

答案 1 :(得分:0)

假设您将NA视为0。

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