R清单中的For循环

时间:2020-04-30 20:29:38

标签: r for-loop

除以下代码外,我将执行以下操作: -如果当前值小于前一个值,请用前一个值进行更改。

但是,正如您已经猜到的那样,它的行为并非如此。 当我在迭代之间打印i时,我可以看到转换已完成,但是在drop_rate列表中未实现。

关于如何升级此代码的任何建议,以便在列表中进行更改?

drop_rate<-list(
x1=c(0.0000000,0.2666667,0.3466667,0.4666667,0.3866667,0.7333333),
x2=c(0.0000000,0.3076923,0.4102564,0.5000000,0.4230769,0.7307692),
x3=c(0.0000000,0.2763158,0.3815789,0.4736842,0.4210526,0.7368421),
x4=c(0.0000000,0.2987013,0.3896104,0.5064935,0.4285714,0.7402597),
x5=c(0.0000000,0.3116883,0.4025974,0.5064935,0.4285714,0.7272727))

for (i in drop_rate){
  if (i[1]>i[2]){i[2]=i[1]}
  if (i[2]>i[3]){i[3]=i[2]}
  if (i[3]>i[4]){i[4]=i[3]}
  print(i)
  if (i[4]>i[5]){i[5]=i[4]}
  print(i)
  if (i[5]>i[6]){i[6]=i[5]}
}

预期的仓库(应更改的内容以**分隔):

0.0000000,0.2666667,0.3466667,0.4666667,**0.4666667**,0.7333333
0.0000000,0.3076923,0.4102564,0.5000000,**0.5000000**,0.7307692
0.0000000,0.2763158,0.3815789,0.4736842,**0.4736842**,0.7368421
0.0000000,0.2987013,0.3896104,0.5064935,**0.5064935**,0.7402597
0.0000000,0.3116883,0.4025974,0.5064935,**0.5064935**,0.7272727

1 个答案:

答案 0 :(得分:1)

问题是[的提取仍然是listlength的提取。因此,我们需要做[[。同样,if/else也没有向量化。基于更新的OP帖子,我们需要检查每个list元素。在这里,如果我们坚持使用if/else,则需要嵌套的for循环

for(i in seq_along(drop_rate)){
     tmp <- drop_rate[[i]]
     for(j  in 2:length(tmp)) {
          if(tmp[j-1] > tmp[j]) {
              tmp[j] <- tmp[j-1]
          }
         }
        drop_rate[[i]] <- tmp 


       }

我们可以使用cummax

drop_rate <- lapply(drop_rate, cummax)
drop_rate
#$x1
#[1] 0.0000000 0.2666667 0.3466667 0.4666667 0.4666667 0.7333333

#$x2
#[1] 0.0000000 0.3076923 0.4102564 0.5000000 0.5000000 0.7307692

#$x3
#[1] 0.0000000 0.2763158 0.3815789 0.4736842 0.4736842 0.7368421

#$x4
#[1] 0.0000000 0.2987013 0.3896104 0.5064935 0.5064935 0.7402597

#$x5
#[1] 0.0000000 0.3116883 0.4025974 0.5064935 0.5064935 0.7272727