You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用R生成去除分组重复值的所有数据集组合?

R分组去重组合生成方案

需求说明

基于给定的分组数据集,生成所有满足duplicate1仅出现一次的去重组合数据集列表,每个列表元素对应一种去重选择组合。

测试数据

groups <- c("A", "A", "A", "B", "B", "B", "C", "C", "C")
value <- c(1, 2, "duplicate1", "duplicate1", 4, "duplicate2", "duplicate2", 5, 6)
id <- 1:9
dat <- data.frame(
  id = id,
  groups = groups,
  value = value
)

解决方案代码

# 1. 识别重复值及对应行
dup_values <- unique(dat$value[duplicated(dat$value)])

# 2. 为每个重复值生成可选保留行的列表
dup_options <- lapply(dup_values, function(v) {
  target_rows <- which(dat$value == v)
  # 对duplicate1强制仅保留单个行,确保最终数据中仅出现一次
  lapply(target_rows, function(r) r)
})
names(dup_options) <- dup_values

# 3. 生成所有去重选择的笛卡尔积组合
combinations <- expand.grid(dup_options, stringsAsFactors = FALSE)

# 4. 基于每个组合生成对应的数据集
result_list <- lapply(1:nrow(combinations), function(i) {
  # 获取当前组合需保留的重复行
  keep_dup <- unlist(combinations[i, ])
  # 获取所有非重复行
  keep_non_dup <- which(!dat$value %in% dup_values)
  # 合并并排序行号,生成最终数据集
  final_rows <- sort(c(keep_non_dup, keep_dup))
  output <- dat[final_rows, ]
  rownames(output) <- NULL
  output
})

# 为列表元素命名,便于区分不同组合
names(result_list) <- apply(combinations, 1, function(x) {
  paste0("comb_", paste(names(x), x, sep = "_", collapse = "_"))
})

结果说明

最终的result_list包含4个数据集,对应所有满足要求的去重组合:

  • comb_duplicate1_3_duplicate2_6:保留A组的duplicate1(id=3)和B组的duplicate2(id=6)
  • comb_duplicate1_4_duplicate2_6:保留B组的duplicate1(id=4)和B组的duplicate2(id=6)
  • comb_duplicate1_3_duplicate2_7:保留A组的duplicate1(id=3)和C组的duplicate2(id=7)
  • comb_duplicate1_4_duplicate2_7:保留B组的duplicate1(id=4)和C组的duplicate2(id=7)

每个数据集均保证duplicate1仅出现一次,同时覆盖了duplicate2的所有去重选择可能。

内容的提问来源于stack exchange,提问作者madmad123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:40