求助:如何用cbind合并空data.frame实现循环迭代累积数据?
问题解决:循环中合并空DataFrame报错的处理
错误原因
你用cbind(data, mpg)报错是因为空DataFrame的行数是0,而mpg有234行,cbind要求所有合并的对象必须行数一致,行数不匹配就会触发这个错误。
可行的解决方法
方法1:循环内判断首次赋值,后续合并
初始化data为NULL,第一次循环时直接把生成的data1赋值给data,之后的循环再用cbind合并:
data <- NULL for (i in 1:100) { # 先补充你的文件读取、初始数据处理逻辑,生成基础data1 rate_col_name <- sprintf("rate_%s", i) data1 <- data1 %>% mutate(!!rate_col_name := (population_2000) * ((population_2010/population_2000_previous))) %>% select(-population_2010, -population_2000_previous) # 用select删列更规范 # 处理合并逻辑 if (is.null(data)) { data <- data1 } else { data <- cbind(data, data1) } rm(pop_2000_previous, pop_2010) gc() }
方法2:先收集所有结果到列表,最后一次性合并(更高效)
循环里把每个data1存入列表,最后用bind_cols(tidyverse推荐)或cbind合并,这种方式比循环内反复合并性能好很多,适合处理100个文件的场景:
result_list <- list() for (i in 1:100) { # 补充文件读取、初始数据处理逻辑 rate_col_name <- sprintf("rate_%s", i) data1 <- data1 %>% mutate(!!rate_col_name := (population_2000) * ((population_2010/population_2000_previous))) %>% select(-population_2010, -population_2000_previous) result_list[[i]] <- data1 rm(pop_2000_previous, pop_2010) gc() } # 合并列表内所有DataFrame library(dplyr) data <- bind_cols(result_list) # 用base R的话可以写:data <- do.call(cbind, result_list)
你的原代码里的几个小问题
- 变量名拼写错误:
date <- cbind(date, date1)应该是data <- cbind(data, data1) - 循环内未初始化
data1,第一次执行时data1不存在会报错,记得先读取文件生成初始data1 - 删除列用
select(-列名)比直接$列名 <- NULL更符合tidyverse风格,也更安全
内容的提问来源于stack exchange,提问作者Nuñes
相关产品推荐
相关产品推荐

