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
相关产品推荐
相关产品推荐

