我在开发基于特定条件更新数据框的函数/算法时遇到了困难。我查看了一些与通过 for 循环“更新”数据帧相关的答案,但我仍然卡住了。
假设我有一个数据框:
df <- data.frame("data_low" = .2143, "data_high" = .7149)
我还有两个功能:
checker(b[1,])
splitter()
我已经考虑尝试用循环来开发它:
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 的实际更新有关。
我认识到这些代码的大部分是不可重现的,但我对这里的处理过程更感兴趣。
任何帮助将不胜感激!
答案 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