R语言for循环无法更新数据集问题求助
问题描述
我尝试在一个每位患者对应两行数据的数据集上运行for循环,目标是给每位患者的cohort字段赋值。循环的逻辑是:先把患者第一行的cohort设为all,用rbinom()生成随机数,再根据这个数值判断第二行的cohort是设为y>=moderate还是DELETE。但运行后循环只执行了第一次迭代就停了,根本没法处理后面的患者。我试过把循环范围改成seq(1, 40, 2),想着偶数行可以在奇数行的迭代里一起处理,但还是没解决问题。
用到的数据集和代码
na.df <- data.frame( patno = c(94, 94, 104, 104, 154, 154, 155, 155, 159, 159, 182, 182, 213, 213, 214, 214, 216, 216, 219, 219, 240, 240, 241, 241, 312, 312, 320, 320, 330, 330, 403, 403, 417, 417, 483, 483, 507, 507, 521, 521), BINew = c(rep(NA, 40)), cohort = factor(c(rep(NA, 40)), levels = c('all', 'y>=moderate', 'DELETE')) ) out <- vector() count = 0 for(val in c(1:nrow(na.df))) { count = count + 1 na.df$cohort[val] <- "all" out[count] <- rbinom(1, 1, 0.5) na.df$BINew[val] <- as.numeric(out[count]) if(na.df$BINew[val] == "0"){ count = count + 1 na.df$cohort[val + 1] <- "y>=moderate" out[count] <- rbinom(1, 1, 0.5) na.df$BINew[val + 1] <- as.numeric(out[count]) } else { na.df$cohort[val + 1] <- "DELETE" } return(na.df) }
问题排查与修复
几个关键问题
- 循环里的
return()直接终止了程序:第一次循环执行到return(na.df)时,整个代码就直接结束了,后面的迭代根本没机会跑,这是循环只执行一次的核心原因。 - 循环范围不对:原循环遍历1到40的所有行,但每个患者占两行,这样会重复处理偶数行(比如val=1处理了1和2行,val=2又会去处理2行),逻辑完全乱了。
- 数值和字符串比较不规范:
na.df$BINew[val]是数值类型,但判断条件里用了== "0"(字符串),虽然R会自动转换,但这种写法容易出问题。
修复后的代码
na.df <- data.frame( patno = c(94, 94, 104, 104, 154, 154, 155, 155, 159, 159, 182, 182, 213, 213, 214, 214, 216, 216, 219, 219, 240, 240, 241, 241, 312, 312, 320, 320, 330, 330, 403, 403, 417, 417, 483, 483, 507, 507, 521, 521), BINew = c(rep(NA, 40)), cohort = factor(c(rep(NA, 40)), levels = c('all', 'y>=moderate', 'DELETE')) ) out <- vector() count = 0 # 只遍历每个患者的第一行,步长设为2 for(val in seq(1, nrow(na.df), 2)) { count = count + 1 # 处理当前患者的第一行 na.df$cohort[val] <- "all" out[count] <- rbinom(1, 1, 0.5) na.df$BINew[val] <- as.numeric(out[count]) # 处理当前患者的第二行 if(na.df$BINew[val] == 0){ # 改成数值和数值比较 count = count + 1 na.df$cohort[val + 1] <- "y>=moderate" out[count] <- rbinom(1, 1, 0.5) na.df$BINew[val + 1] <- as.numeric(out[count]) } else { na.df$cohort[val + 1] <- "DELETE" } } # 循环跑完后再输出结果 na.df
修复说明
- 删掉了循环里的
return(),让循环能完整遍历所有患者的第一行。 - 循环范围改成
seq(1, nrow(na.df), 2),只处理每个患者的奇数行,每次迭代同时处理对应的偶数行,避免重复操作。 - 把判断条件里的
"0"改成0,保持类型一致,减少意外错误。
内容的提问来源于stack exchange,提问作者ikeagoddess
相关产品推荐
相关产品推荐

