R语言实现:覆盖id与quality全部分组组合的数据集随机抽样
R语言分层抽样实现方案
前置说明:请先确认id和quality两列的唯一组合总数小于2000,否则该需求无法实现,需要先调整目标样本量
实现逻辑分为两步:
- 首先从每一组
id+quality的唯一组合中随机抽取1条记录,确保所有分组都被覆盖 - 计算剩余需要补充的样本量,从原数据集未被抽取的记录中随机补抽,凑够2000条即可
完整可运行代码如下:
library(dplyr) # 计算id和quality的唯一组合总数 n_unique <- nrow(distinct(df, id, quality)) # 异常判断:唯一组合数超过样本量上限时直接终止 if (n_unique > 2000) { stop("分组组合总数超过2000,无法在指定样本量内覆盖全部分组,请调高样本量") } # 第一步:每个分组随机抽1条,保证全部分组覆盖 sample_covered <- df %>% group_by(id, quality) %>% slice_sample(n = 1) %>% ungroup() # 第二步:补抽剩余所需样本,排除已经被抽取的记录 remaining_sample_num <- 2000 - nrow(sample_covered) sample_random <- df %>% anti_join(sample_covered, by = c("id", "quality")) %>% slice_sample(n = remaining_sample_num) # 合并得到最终2000条样本 final_sample <- bind_rows(sample_covered, sample_random)
你可以用以下代码验证结果是否符合要求:
# 验证是否覆盖所有id+quality组合 nrow(distinct(final_sample, id, quality)) == n_unique # 验证样本量是否为2000 nrow(final_sample) == 2000
以上方案对16万行规模的数据集处理效率极高,无需额外优化即可快速得到结果。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

