如何生成数据集所有可能的均等列拆分组合列表?
生成数据集的所有均等拆分组合
要生成所有符合要求的拆分,不能用sample()(它只能随机选取单次拆分),而是需要枚举所有可能的列组合,并处理重复拆分的情况,以下是完整的解决方案:
核心思路
- 根据数据集列数的奇偶性,确定拆分后其中一个子集的列数:
- 偶数列:子集列数为总列数的一半,此时每个拆分会被枚举两次(比如选列A和选列A的补集是同一个拆分),需要去重
- 奇数列:其中一个子集列数为
(总列数+1)/2,另一个为(总列数-1)/2,此时所有组合都是唯一拆分,无需去重
- 用
combn()生成所有可能的列组合,再筛选出不重复的有效组合 - 遍历每个有效组合,生成对应的两个子数据集,最终组合成拆分列表
完整代码
# 原始数据集 data <- structure(list(V1 = c(0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1), V2 = c(0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1), V3 = c(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0), V4 = c(0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0)), class = "data.frame", row.names = c(NA, -20L)) # 计算列数和目标子集列数 n_cols <- ncol(data) col_names <- colnames(data) if (n_cols %% 2 == 0) { k <- n_cols / 2 # 生成所有k列的组合 all_combs <- combn(col_names, k, simplify = FALSE) # 去重:保留组合首列小于其补集首列的组合,避免重复拆分 unique_combs <- all_combs[sapply(all_combs, function(x) { comp <- setdiff(col_names, x) x[1] < comp[1] })] } else { k <- (n_cols + 1) %/% 2 # 奇数列时所有组合都是唯一拆分 unique_combs <- combn(col_names, k, simplify = FALSE) } # 生成所有拆分的列表 all_splits <- lapply(unique_combs, function(comb) { s1 <- data[comb] s2 <- data[setdiff(col_names, comb)] list(s1 = s1, s2 = s2) }) # 验证拆分数量(示例数据为4列,应返回3种拆分) length(all_splits) # 查看所有拆分 all_splits
代码说明
combn(col_names, k, simplify = FALSE):生成从列名中选取k个的所有可能组合,返回一个列表,每个元素是一组列名- 偶数列去重逻辑:通过比较组合与其补集的第一个列名字符顺序,只保留其中一个,确保每个拆分只被记录一次
lapply()遍历每个有效组合,生成对应的两个子数据集,并将它们包装成子列表,最终汇总为总拆分列表
内容的提问来源于stack exchange,提问作者MetehanGungor
相关产品推荐
相关产品推荐

