如何在R中生成14个数字划分为两个独立分组的全部组合列表
R实现1-14拆分为两组全组合
14个数字每个都有归入Group X、归入Group Y两种选择,总计2^14=16384种组合,和你预期的总数一致,以下是可直接运行的实现方案:
位运算实现(效率最优)
通过整数二进制位标记数字归属,遍历0到16383的所有整数即可覆盖全部组合,运行速度最快:
nums <- 1:14 total_combo <- 2^length(nums) # 预分配内存存储结果 res <- vector("list", total_combo) for (i in seq_len(total_combo)) { # 二进制位为1的数字归入Group X x_flag <- as.logical(intToBits(i-1)[1:length(nums)]) group_x <- nums[x_flag] # 剩余数字归入Group Y group_y <- nums[!x_flag] res[[i]] <- list( x = group_x, y = group_y, x_str = paste(group_x, collapse = ", "), y_str = paste(group_y, collapse = ", ") ) }
expand.grid实现(可读性更强)
直接生成所有归属逻辑的真值表,代码逻辑更直观:
nums <- 1:14 # 生成14列、每列取值为TRUE/FALSE的全组合真值表 belong_tbl <- expand.grid(rep(list(c(TRUE, FALSE)), length(nums))) res <- apply(belong_tbl, 1, function(flag){ group_x <- nums[flag] group_y <- nums[!flag] list( x = group_x, y = group_y, x_str = paste(group_x, collapse = ", "), y_str = paste(group_y, collapse = ", ") ) })
输出为示例格式的表格
如果需要得到和你给出的示例结构一致的数据框,运行以下代码即可:
# 提取逗号分隔的字符串格式分组,生成数据框 result_df <- data.frame( `Group X` = sapply(res, `[[`, "x_str"), `Group Y` = sapply(res, `[[`, "y_str"), check.names = FALSE ) # 按Group X的元素个数、元素值排序,和示例展示的顺序完全对齐 result_df <- result_df[order(nchar(result_df$`Group X`), result_df$`Group X`), ]
排序后查看前3行,和你给出的示例完全匹配:
| Group X | Group Y |
|---|---|
| 1 | 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 |
| 1, 2 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 |
| 1, 2, 3 | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 |
补充说明:如果需要排除「Group X为空」「Group Y为空」的两种边界情况,增加一行过滤代码即可:
result_df <- result_df[nchar(result_df$Group X) > 0 & nchar(result_df$Group Y) > 0, ],过滤后剩余16382种组合。如果需要固定分组大小(比如两组各7个数字),直接用combn函数按固定元素个数生成组合即可,不需要遍历全量2^14种情况。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

