R语言中如何按ID与Group分组随机抽取对应颜色的全量子组样本
可行实现方案
前置代码准备
先运行基础数据处理代码,对齐你提供的数据集结构:
# 加载依赖包 library(dplyr) library(tibble) # 构建原始示例数据 df <- data.frame( ID = rep(c('Bravo', 'Charlie', 'Delta', 'Echo'), c(4,4,11,3)), Group = rep(c(1,2,3,4,1,2,1), c(5,1,1,1,6,5,3)), Color = rep(c('red','yellow','red','yellow','blue','red','yellow','blue','red','yellow'), c(1,3,5,2,3,2,2,1,1,2)), Score = c(0.75, 0.9, 0.65, 0.7, 0.55, 0.6, 0.8, 0.9, 0.85, 0.9, 0.8, 0.45, 0.6, 0.65, 0.63, 0.51, 0.7, 0.56, 0.68, 0.87, 0.85, 0.89) ) # 生成合并ID与Group的Key列 df <- df %>% add_column(Key = paste(df$ID, df$Group, sep = "_"), .after = 2) %>% mutate(Key = as.factor(Key))
单份抽样数据框生成
核心实现逻辑围绕无放回随机选择规则设计,分两步完成:
- 按
Key完成分组,在每个组内对所有可用颜色去重,随机抽取1个选中的颜色 - 根据选中的
Key+颜色匹配对,回原数据框中筛选出对应颜色的全部关联行
# 生成1份符合规则的抽样数据框 sample_1 <- df %>% group_by(Key) %>% # 组内去重颜色后随机抽1个 slice_sample(n = 1, distinct(Color)) %>% # 匹配回原数据,拉取选中颜色的所有行 inner_join(select(., Key, Color), by = c("Key", "Color")) %>% ungroup()
规则适配效果:
- 针对存在多种颜色的Key(比如Bravo_1组同时有红、黄颜色行),会随机等概率选中其中一种颜色,拉取该颜色的全部关联行
- 针对只有单一颜色的Key(比如Charlie的所有分组只有红色行),去重后仅1个颜色选项,随机抽样会100%选中该颜色,完全符合预期
版本兼容提示:
slice_sample()的distinct参数为dplyr 1.1.0及以上版本支持,若版本较低,可先按Key分组提取唯一颜色值,再完成随机抽样后与原数据匹配即可。
批量生成多份抽样数据框
如果需要生成多份独立抽样结果用于后续分析,可以把单次抽样逻辑封装成函数批量运行:
# 封装通用抽样函数 sample_by_key_color <- function(input_df) { input_df %>% group_by(Key) %>% slice_sample(n = 1, distinct(Color)) %>% inner_join(select(., Key, Color), by = c("Key", "Color")) %>% ungroup() } # 生成20份独立抽样数据框,存储在列表中方便调用 n_total_samples <- 20 sample_list <- lapply(1:n_total_samples, function(x) sample_by_key_color(df))
可通过
sample_list[[序号]]查看对应序号的抽样结果,每个数据框内每个Key分组仅包含1种颜色的所有关联行。
内容的提问来源于stack exchange,提问作者user41421
相关产品推荐
相关产品推荐

