使用For循环覆盖R数据框列中值的问题求助
问题分析
你的代码核心有两个致命错误:
- 前两个循环修改的是单独的
Grupa向量,而非dane2数据框里的Grupa列,等于白做操作; - 所有循环的索引逻辑完全错误:
dane2$Grupa[dane2$Grupa]是筛选dane2$Grupa为TRUE的行,但初始值都是NA,根本不会匹配任何行;且for (i in k1)是遍历k1的每一列,不是目标行,完全不符合需求。
解决方案
假设你的k1/k2/m1/m2数据框和dane2有共同的唯一标识(比如行名或ID列),以下是两种可行的修正方式:
方案1:修正匹配逻辑(保留你原本的dane2构建思路)
直接通过共同标识定位目标行,替换Grupa列的NA值:
# 构建dane2并添加Grupa列 dane2 <- dane[, -c(3,4,6,7,8,9,10,11,12,13,14)] dane2$Grupa <- NA # 直接给dane2添加列,无需单独创建Grupa向量 # 处理K1分组:通过行名匹配目标行 k1 <- kob1chol[sample(nrow(kob1chol), 15), ] dane2$Grupa[rownames(dane2) %in% rownames(k1)] <- "K1" # 处理K2分组 k2 <- kob2chol[sample(nrow(kob2chol), 15), ] dane2$Grupa[rownames(dane2) %in% rownames(k2)] <- "K2" # 处理M1分组 m1 <- mez1chol[sample(nrow(mez1chol), 15), ] dane2$Grupa[rownames(dane2) %in% rownames(m1)] <- "M1" # 处理M2分组 m2 <- mez2chol[sample(nrow(mez2chol), 15), ] dane2$Grupa[rownames(dane2) %in% rownames(m2)] <- "M2"
如果你的数据用ID列做唯一标识,把rownames()替换成$ID即可,比如:
dane2$Grupa[dane2$ID %in% k1$ID] <- "K1"
方案2:向量化合并(R推荐写法,避免循环)
直接给每个分组数据添加Grupa列后合并,更简洁高效:
# 给每个分组抽样并添加Grupa标识 k1 <- kob1chol[sample(nrow(kob1chol), 15), ] k1$Grupa <- "K1" k2 <- kob2chol[sample(nrow(kob2chol), 15), ] k2$Grupa <- "K2" m1 <- mez1chol[sample(nrow(mez1chol), 15), ] m1$Grupa <- "M1" m2 <- mez2chol[sample(nrow(mez2chol), 15), ] m2$Grupa <- "M2" # 合并所有分组得到最终dane2 dane2 <- rbind(k1, k2, m1, m2) # 若需要和原dane的列保持一致,可添加筛选:dane2 <- dane2[, colnames(dane[, -c(3,4,6,7,8,9,10,11,12,13,14)])]
内容的提问来源于stack exchange,提问作者Karo
相关产品推荐
相关产品推荐

