You need to enable JavaScript to run this app. R语言中如何按ID与Group分组随机抽取对应颜色的全量子组样本
优惠活动
大模型
产品
解决方案
定价
更多

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))

单份抽样数据框生成

核心实现逻辑围绕无放回随机选择规则设计,分两步完成:

  1. 按Key完成分组,在每个组内对所有可用颜色去重,随机抽取1个选中的颜色
  2. 根据选中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 00:24:02