R语言如何从向量无放回随机抽取元素赋值给不同分组变量
R实现无放回随机分组方案
你需要将长度为37的vars向量无放回拆分为6个指定长度的分组,先核对各组长度总和:4+5+6+9+6+7=37,刚好覆盖全部元素,以下是两种可直接运行的实现方式。
方法1:洗牌切片法(推荐,效率更高)
核心逻辑是先把整个向量随机打乱顺序,再按照各组要求的长度直接切片,避免反复更新抽样池的冗余操作:
# 原始元素向量 vars <- c("a1", "b2", "c3", "d4", "e5", "f6", "g7", "h8", "i9", "j10", "k11", "l12", "m13", "n14", "o15", "p16", "q17", "r18", "s19", "t20", "u21", "v22", "w23", "x24", "y25", "z26", "a27", "b28", "c29", "d30", "e31", "f32", "g33", "h34", "i35", "j36", "k37") # 按Group1到Group6的顺序定义每组样本量 group_sizes <- c(4, 5, 6, 9, 6, 7) # 随机打乱原向量(无放回洗牌) set.seed(NULL) # 若需要结果可复现,把NULL替换成任意数字比如123,固定随机种子 shuffled_vars <- sample(vars) # 计算各组切片的边界位置 split_index <- cumsum(c(0, group_sizes)) # 切片生成各个分组 Group1 <- shuffled_vars[(split_index[1] + 1):split_index[2]] Group2 <- shuffled_vars[(split_index[2] + 1):split_index[3]] Group3 <- shuffled_vars[(split_index[3] + 1):split_index[4]] Group4 <- shuffled_vars[(split_index[4] + 1):split_index[5]] Group5 <- shuffled_vars[(split_index[5] + 1):split_index[6]] Group6 <- shuffled_vars[(split_index[6] + 1):split_index[7]]
方法2:逐次抽样法(逻辑直观)
每次从剩余未抽取的元素中抽对应数量的元素赋值给分组,抽完就把已选元素从剩余池里剔除,适合后续需要灵活调整抽样规则的场景:
# 初始化剩余元素池 remaining <- vars Group1 <- sample(remaining, 4) remaining <- setdiff(remaining, Group1) Group2 <- sample(remaining, 5) remaining <- setdiff(remaining, Group2) Group3 <- sample(remaining, 6) remaining <- setdiff(remaining, Group3) Group4 <- sample(remaining, 9) remaining <- setdiff(remaining, Group4) Group5 <- sample(remaining, 6) remaining <- setdiff(remaining, Group5) Group6 <- sample(remaining, 7)
注意事项
- 两种方法都严格满足无放回抽样要求,所有分组内元素无重复,全部来自原始
vars向量 - 如果不需要抽完全部37个元素,直接调整最后一组的抽样长度、或者删掉后续分组的抽样代码即可
- 固定随机种子后,每次运行代码会得到完全一致的分组结果,适合需要重复验证分析的场景
内容的提问来源于stack exchange,提问作者user3542212
相关产品推荐
相关产品推荐

