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

R语言如何实现双因子数据集的分组分层随机抽样

问题场景

你需要基于100行的分组数据框实现分层抽样,规则如下:

  • 数据分为A、B两个物种组,各50行,包含a、b两个关联变量
  • 每次抽样(对应1个set)从对应物种组中随机抽取6行,组内每行标记为1个rep
  • A、B组分别独立重复抽样500次,总计1000个set
  • 最终输出需包含set、rep、a、b、sp5列,格式匹配你给出的预期样例
原有代码问题
  • R中for循环不会自动返回迭代结果,直接将循环表达式赋值给变量无法保存所有抽样输出
  • sample(df[i,],6,replace = TRUE)的写法是对单行的列维度做抽样,不是按行抽取样本,因此会出现重复的a、sp列
  • 未按sp列拆分抽样池,无法保证A、B样本从对应分组抽取,也未生成set、rep标识字段
可运行实现代码
# 构造示例数据
a <- rnorm(100, 2,1)
b <- rnorm(100, 2,1)
sp <- rep(c("A","B"), each = 50)  
df <- data.frame(a,b,sp)

# 拆分两个物种的独立抽样池
pool_A <- df[df$sp == "A", ]
pool_B <- df[df$sp == "B", ]

# 初始化结果存储列表
result_ls <- list()

# 抽取A组500个set
for(s in 1:500){
  sub_sample <- pool_A[sample(nrow(pool_A), 6, replace = TRUE), ]
  sub_sample$set <- s
  sub_sample$rep <- 1:6
  result_ls[[length(result_ls)+1]] <- sub_sample
}

# 抽取B组500个set,set编号顺延501-1000
for(s in 501:1000){
  sub_sample <- pool_B[sample(nrow(pool_B), 6, replace = TRUE), ]
  sub_sample$set <- s
  sub_sample$rep <- 1:6
  result_ls[[length(result_ls)+1]] <- sub_sample
}

# 合并所有结果,调整列顺序匹配预期格式
df.sample <- do.call(rbind, result_ls)
df.sample <- df.sample[, c("set", "rep", "a", "b", "sp")]
# 按set号排序,重置行名
df.sample <- df.sample[order(df.sample$set), ]
rownames(df.sample) <- NULL
参数说明
  • 如果需要无放回抽样(同一个set中不会重复抽到同一行),将sample()中的replace = TRUE改为replace = FALSE即可
  • 如果需要A、B组的set交替排列,只需调整set编号赋值规则,例如A组取奇数编号、B组取偶数编号

内容的提问来源于stack exchange,提问作者Rspacer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:12:30