R语言:如何为数据集中每组随机给chosen列赋值1?
问题与解决方案
我们有一个按ID分组的数据集,每个ID对应3个备选方案,chosen列默认全为0,需要为每个ID随机选中一个备选方案,将对应行的chosen设为1。
原代码问题分析
你提供的循环代码未生效,核心原因是变量名大小写不匹配:数据集里的目标列是chosen(小写首字母),但代码中写的是sim_data$Chosen(大写首字母),导致赋值操作没有作用到正确的列上。另外原循环的范围逻辑是正确的——seq(1, nrow(sim_data), 3)会生成1、4、…、298这些起始行索引,每个索引加2刚好覆盖每组的3行(比如298对应第100组的298、299、300行)。
修复后的代码
方法1:修正原循环
只需调整变量名大小写,同时保留可复现的随机种子:
set.seed(123) # 确保随机结果一致 for (i in seq(1, nrow(sim_data), 3)) { chosen_index <- sample(i:(i+2), 1) sim_data$chosen[chosen_index] <- 1 # 修正为小写的chosen }
方法2:用dplyr分组处理(更简洁)
无需循环,直接按ID分组后随机标记选中项:
library(dplyr) set.seed(123) sim_data <- sim_data %>% group_by(ID) %>% mutate(chosen = as.integer(row_number() == sample(1:3, 1))) %>% ungroup()
方法3:用data.table高效处理
如果数据集规模较大,data.table的分组操作效率更高:
library(data.table) set.seed(123) setDT(sim_data)[, chosen := as.integer(.I == sample(.I, 1)), by = ID]
内容的提问来源于stack exchange,提问作者RokasR
相关产品推荐
相关产品推荐

