在R中按步骤从多数据集数据框中分层随机抽取指定行数样本
分步骤实现跨数据集随机抽样需求
需求说明
现有数据框结构如下:
- 每行对应一条物种记录,同一dataset内无重复物种,但物种可跨dataset重复
- 需要完成分步骤随机抽样:
- Step 1:随机抽取1行样本
- Step 2:随机抽取2行,且2行来自不同dataset
- ...
- Step 11:随机抽取11行,且11行全部来自不同dataset
示例数据
用户提供的示例数据构造代码:
# 构造示例数据框 x1 <- matrix(rnorm(200), nrow= 100, ncol=2) x2 <- c(replicate(5, "AA"),replicate(15, "BB"),replicate(15, "CC"), replicate(10, "DD"),replicate(10, "EE"),replicate(10, "FF"), replicate(10, "GG"),replicate(5, "HH"),replicate(5, "II"), replicate(15, "JJ")) df <- data.frame(cbind(x1,x2)) colnames(df) <- c("variable1", "variable2","dataset") # 修正数值列类型(cbind会自动转成字符型,这里还原) df$variable1 <- as.numeric(df$variable1) df$variable2 <- as.numeric(df$variable2)
问题分析
用户尝试使用sampling包的strata()函数,但该函数是按指定的每个层(dataset)抽样数量执行分层抽样,无法直接满足「抽取k个来自不同dataset的样本」的需求。
解决方案
使用dplyr包实现分组抽样逻辑,编写通用函数处理不同步骤的抽样需求:
# 安装并加载dplyr(若未安装) # install.packages("dplyr") library(dplyr) # 定义抽样函数:输入数据框和抽样行数k,返回符合要求的样本 sample_cross_dataset <- function(df, k) { if (k == 1) { # Step1:直接随机抽取1行 return(df %>% sample_n(size = 1)) } # 检查可用的不同dataset数量 unique_ds_count <- length(unique(df$dataset)) if (unique_ds_count < k) { stop(paste("错误:当前仅存在", unique_ds_count, "个不同dataset,无法抽取", k, "个跨dataset样本")) } # 随机选择k个不同的dataset,再从每个dataset中各抽1行 df %>% filter(dataset %in% sample(unique(df$dataset), size = k)) %>% group_by(dataset) %>% sample_n(size = 1) %>% ungroup() } # 执行各步骤抽样 step1_sample <- sample_cross_dataset(df, 1) step2_sample <- sample_cross_dataset(df, 2) step3_sample <- sample_cross_dataset(df, 3) # ... step11_sample <- sample_cross_dataset(df, 11) # 注意:需确保df中至少有11个不同dataset,否则会触发报错
逻辑说明
- k=1的情况:无需考虑dataset,直接随机抽取1行即可
- k≥2的情况:
- 先校验现有不同dataset的数量是否满足需求,避免无效抽样
- 随机挑选k个不重复的dataset
- 对每个选中的dataset,随机抽取1条记录,最终得到k条来自不同dataset的样本
内容的提问来源于stack exchange,提问作者mmmap
相关产品推荐
相关产品推荐

