如何在R中生成数据框所有行的n次全组合?
生成数据框行的n次全组合解决方案
需求说明
现有一个8行3列的二进制数据框test,需要生成其所有行的n次全组合:
- 当n=2时,需得到64行6列的数据框(或包含64个组合元素的列表),每行由两个原行的列拼接而成。
方案1:生成目标数据框
用expand.grid生成行索引的全组合,再提取对应行拼接,代码如下:
# 创建原数据框 test <- expand.grid(rep(list(0:1), 3)) # 定义组合次数n n <- 2 # 生成所有行索引的n次全组合 idx_combs <- expand.grid(rep(list(1:nrow(test)), n)) # 拼接对应行,生成最终数据框 result_df <- do.call(rbind, apply(idx_combs, 1, function(idx) { do.call(cbind, test[idx, ]) })) # (可选)给列重命名,区分不同组合组 colnames(result_df) <- paste0("Group", rep(1:n, each = ncol(test)), "_", colnames(test))
执行后result_df即为n=2时64行6列的目标数据框,n取其他值时只需修改n的取值即可。
方案2:生成组合列表
如果需要以列表形式存储每个组合(每个元素是n个原行的集合),可先将原数据框的行拆为列表元素,再用expand.grid生成组合:
# 创建原数据框 test <- expand.grid(rep(list(0:1), 3)) # 定义组合次数n n <- 2 # 将原数据框的每一行转为列表元素 row_list <- split(test, seq(nrow(test))) # 生成n次全组合列表 result_list <- expand.grid(rep(list(row_list), n))
此时result_list的每一行对应一个n次行组合,每个单元格是原数据框的一行数据。
问题说明
你之前用expand.grid未成功,是因为直接传入了原数据框而非以行为元素的列表。上述方案通过先将行转为列表元素,再传入expand.grid重复n次,完美匹配需求。
内容的提问来源于stack exchange,提问作者Rel_Ai
相关产品推荐
相关产品推荐

