如何在R中生成元素仅用一次的两组三人无重复组合
无重复分组的R实现方案
你用combn生成的20种3个个体的组合里,每一组都对应一个唯一的补集(剩下的3个个体),这两者就构成一组无重复的完整分组。因为每对分组会被combn生成两次(比如先出abc再出def),所以只需要取前一半的组合,再匹配它们的补集,就能得到你要的10种结果。
优化后的代码实现
首先简化你生成组合的代码,combn可以直接处理字符向量,不需要手动循环替换:
individuals <- c("a","b","c","d","e","f") # 直接生成所有3个个体的组合,结果是列数为20的矩阵 all_combs <- combn(individuals, 3) # 计算有效分组对的数量:总组合数的一半 pair_count <- ncol(all_combs) / 2 # 生成所有无重复分组对 unique_groups <- lapply(1:pair_count, function(i) { group1 <- all_combs[, i] # 补集就是不在group1里的个体 group2 <- setdiff(individuals, group1) list(group1 = group1, group2 = group2) }) # 查看第一个分组对 unique_groups[[1]] # 或者把结果整理成数据框方便查看 group_df <- do.call(rbind, lapply(unique_groups, function(g) { data.frame( group1 = paste(g$group1, collapse = ""), group2 = paste(g$group2, collapse = "") ) })) print(group_df)
代码说明
combn(individuals, 3)直接生成字符组合矩阵,避免了原代码中数字转字母的循环操作,更高效简洁。setdiff(individuals, group1)用来获取当前组合的补集,也就是另一组的3个个体。- 通过
lapply遍历前10个组合,每个组合和它的补集构成一个无重复分组对,最终得到10种符合要求的结果。
内容的提问来源于stack exchange,提问作者Rgray
相关产品推荐
相关产品推荐

