R-Studio数据筛选:抽取覆盖所有变量取值的50%样本方法咨询
实现覆盖所有变量取值的分层抽样方案
核心思路
先抽取「必选样本集」保证所有分类字段的所有取值至少出现1次,再从剩余样本中随机补抽至总样本量的50%,既满足覆盖要求也符合随机抽样的特性。
调整后代码
library(dplyr) # 1. 定义需要全覆盖所有取值的分类字段 cover_cols <- c("PRODUCT_TYPE", "OFFER", "INENTORY") # 2. 生成必选样本集:每个字段的每个取值各抽1条,合并后去重 mandatory_samples <- lapply(cover_cols, function(col) { data2 %>% group_by(across(all_of(col))) %>% slice_sample(n = 1) %>% ungroup() }) %>% bind_rows() %>% distinct(ID, .keep_all = TRUE) # 3. 计算目标样本量与待补抽数量 total_rows <- nrow(data2) target_rows <- floor(total_rows * 0.5) add_rows <- target_rows - nrow(mandatory_samples) # 异常校验:必选样本量超过目标值时抛出提示 if (add_rows < 0) { stop("必选覆盖样本量已超过总样本的50%,请调高抽样比例") } # 4. 补抽剩余样本后合并得到最终子集 add_samples <- data2 %>% filter(!ID %in% mandatory_samples$ID) %>% slice_sample(n = add_rows) subset1 <- bind_rows(mandatory_samples, add_samples)
代码说明
- 如果需要覆盖的字段有调整,直接修改
cover_cols向量的内容即可 - 用
distinct(ID, .keep_all = TRUE)去重是为了避免同一条记录同时覆盖多个字段取值时被重复计入,浪费样本量 - 校验逻辑可以避免样本量过小、必选需求超过抽样比例的异常场景
内容的提问来源于stack exchange,提问作者Mariana
相关产品推荐
相关产品推荐

