根据条件更新数据帧(循环)R

时间:2021-03-15 23:41:36

标签: r

我在开发基于特定条件更新数据框的函数/算法时遇到了困难。我查看了一些与通过 for 循环“更新”数据帧相关的答案,但我仍然卡住了。

假设我有一个数据框:

df <- data.frame("data_low" = .2143, "data_high" = .7149)

  • 其中 data_low 和 data_high 是数据框中某列的最大值和最小值

我还有两个功能:

checker(b[1,])

  • 获取 data_high 和 data_low 的值,并返回一个标量。如果标量小于 1,我想将其存储在另一个数据框中,例如“d”。否则,我想用以下函数拆分“b”:

splitter()

  • 按 data_high 和 data_low 的中位数拆分“b”。

我已经考虑尝试用循环来开发它:

storage <- data.frame(data_low = double(), data_high = double()

for( i in 1:nrow(b)){

     if(checker(b[i,]) <1){
         storage <- splitter(b[i,])
         
     } else {      
     temp <- splitter(b[i,])
     
     b <- rbind(b,temp)
            } 
     }


两次迭代后我想要的输出(其中每行检查 >1:

** 显然这些数字是随机选取的,我只是希望获得一些与基于案例循环/更新数据帧相关的直觉..

starting at i = 0:

| .2143 | .7149 |,

i = 2 
| .2143 | .4442 | ** Note at splitter() should break this into 2 rows after i = 2 is complete.
| .4442 | .7149 | ** And again here

i = 3

| .2143 | .3002 | 
| .3002 | .4442 |
| .4442 | .5630 |
| .5630 | .7149 |

谁能给我一些关于如何组织这个循环的提示?我认为我的问题与 rbind 和/或 b 的实际更新有关。

我认识到这些代码的大部分是不可重现的,但我对这里的处理过程更感兴趣。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以使用嵌套循环(一个用于迭代次数,一个用于 b 中的行数)或使用嵌套的 Reduce 调用来执行此操作,如下所示。

Reduce(function(x, y) {
  List=apply(x, 1, function(z) {
    med=median(c(z[1], z[2]))
    dat=data.frame(data_low=c(z[1], med), data_high=c(med, z[2]))
    rownames(dat)=NULL
    return(dat)
  })
  Reduce(function(w, z) rbind(w, z), List)
}, rep(NA, 2), init=df)

一位代表:

  data_low data_high
1   0.2143    0.4646
2   0.4646    0.7149

两个代表:

  data_low data_high
1  0.21430   0.33945
2  0.33945   0.46460
3  0.46460   0.58975
4  0.58975   0.71490

三个代表:

data_low data_high
1 0.214300  0.276875
2 0.276875  0.339450
3 0.339450  0.402025
4 0.402025  0.464600
5 0.464600  0.527175
6 0.527175  0.589750
7 0.589750  0.652325
8 0.652325  0.714900