R语言如何将dataframe按行拆分生成所有两分组组合子数据集
实现需求的R代码方案
问题场景
现有测试数据框结构如下:
Site <- c(1, 2, 3, 4, 5, 6) Compound_1 <- c(0.5, 0.25, 0.5, 0.75, 0, 0.25) Compound_2 <- c(0.25, 0.5, 0.5, 0.75, 0.25, 0) df <- data.frame(Site, Compound_1, Compound_2) print(df)
需要实现的逻辑:
- 将6个Site拆分为x、y两个组,生成所有可能的拆分组合,总计64种(每个Site有2种分组选择,2^6=64)
- 每种组合输出2个独立数据框,完整保留
Compound_1、Compound_2所有列信息,不能仅返回Site编号 - 示例拆分规则:组合1为组x含Site1、组y含Site2-6;组合2为组x含Site2、组y含剩余Site
可直接运行的实现代码
核心逻辑是用二进制掩码标记每个Site的分组归属,通过for循环遍历所有掩码生成拆分结果:
# 初始化存储所有拆分结果的列表 split_results <- list() site_count <- nrow(df) # 遍历所有64种分组可能 for (combo_id in 0:(2^site_count - 1)) { # 将当前组合编号转为6位二进制掩码,值为1代表Site归入组x,0代表归入组y group_mask <- as.integer(intToBits(combo_id))[1:site_count] # 按掩码拆分,保留所有原始列 group_x <- df[group_mask == 1, ] group_y <- df[group_mask == 0, ] # 按组合编号存储结果 split_results[[paste0("combo_", combo_id + 1)]] <- list( x = group_x, y = group_y ) }
使用说明
- 运行完成后,
split_results列表包含全部64种拆分结果,可直接按索引调用 - 示例:调取第1种组合的两个分组数据框
# 查看组合1的组x split_results$combo_1$x # 查看组合1的组y split_results$combo_1$y
- 如果需要排除两个极端空组(组x无数据/组y无数据),只需将循环范围修改为
1:(2^site_count - 2),最终得到62种有效拆分。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

