You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:01:18