如何用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
相关产品推荐
相关产品推荐

