R语言双变量嵌套循环问题:如何生成729个数据框并存入列表?
解决R语言嵌套循环生成合并数据框并存入列表的问题
我有两个数据集R1和R2,需要生成27×27=729个数据框,每个数据框由R1的一行与R2的一行通过rbind合并得到,并将这些数据框存入列表。当前嵌套循环代码无法正确实现该需求,请问如何正确运行这个循环以得到包含729个数据框的列表?
原代码:
#data sets R1 <- as.data.frame(expand.grid(rep(list(0:2), 3))) R2 <- as.data.frame(expand.grid(rep(list(0:2), 3))) out_list <- list() for (i in 1:27) { for (j in 1:27) { output <- rbind(R1[i, ], R2[j, ]) } }
问题分析
原代码的核心问题是没有将每次循环生成的合并数据框存入out_list:每次循环仅更新output变量,覆盖之前的结果,但从未把结果添加到列表中,最终out_list始终是空的。此外,硬编码行数27不够灵活,提取单行时还可能意外将数据框转为向量。
修正方案1:完善嵌套循环
通过新增索引变量追踪列表位置,确保每个合并结果都被存入列表的对应位置:
# 数据集定义 R1 <- as.data.frame(expand.grid(rep(list(0:2), 3))) R2 <- as.data.frame(expand.grid(rep(list(0:2), 3))) out_list <- list() index <- 1 # 记录当前要存入列表的位置 for (i in 1:nrow(R1)) { # 用nrow代替硬编码27,适配行数变化 for (j in 1:nrow(R2)) { # drop=FALSE确保提取单行后仍为数据框,避免转为向量 output <- rbind(R1[i, , drop = FALSE], R2[j, , drop = FALSE]) out_list[[index]] <- output index <- index + 1 # 索引自增,准备存入下一个结果 } } # 验证结果:输出729 length(out_list)
修正方案2:更简洁的非循环实现
利用expand.grid生成所有行索引组合,再通过lapply批量处理,避免手动管理索引:
# 数据集定义 R1 <- as.data.frame(expand.grid(rep(list(0:2), 3))) R2 <- as.data.frame(expand.grid(rep(list(0:2), 3))) # 生成所有i和j的索引组合 all_combinations <- expand.grid(i = 1:nrow(R1), j = 1:nrow(R2)) # 遍历每个组合,生成合并数据框并存入列表 out_list <- lapply(1:nrow(all_combinations), function(k) { i <- all_combinations$i[k] j <- all_combinations$j[k] rbind(R1[i, , drop = FALSE], R2[j, , drop = FALSE]) }) # 验证结果:输出729 length(out_list)
内容的提问来源于stack exchange,提问作者MetehanGungor
相关产品推荐
相关产品推荐

