R语言合并文件夹CSV文件报错:无法打开'NA'文件
问题分析与修正方案
首先看你遇到的报错:
Error in file(file, "rt") : cannot open the connection
In addition: Warning message: In file(file, "rt") : cannot open file 'NA': No such file or directory
这个错误的根源是你在循环里覆盖了存储所有文件名的file_list变量,导致后续循环无法获取正确的文件名:
在循环的第一行你写了:
file_list<- as.character(file_list[i])
第一次循环时,file_list原本是包含6个文件名的向量,执行这行后,它被替换成了第一个文件名的字符串。到第二次循环(i=2)时,file_list已经是单个字符串,file_list[i]就会返回NA,自然无法读取名为NA的文件。
修正后的代码
把覆盖file_list的那行改成用新变量存储当前文件即可:
Inputs_Path <- "C:/MortgageSafe/Cirt2014-1/Sample" Output_Path <- "C:/MortgageSafe/Cirt2014-1/BatchOutput" setwd(Inputs_Path) file_list<-list.files() length_file_list<-length(file_list) # 初始化合并数据框 Collated_Sims <- data.frame() for(i in 1:length_file_list){ # 用新变量存储当前文件,不要覆盖原file_list current_file <- as.character(file_list[i]) Mortgage_Sims<- read.table(current_file, header=TRUE, sep=",") if(i == 1){ Collated_Sims <- Mortgage_Sims } else{ Collated_Sims <- rbind(Collated_Sims, Mortgage_Sims) } } Collated_Sims[, 1]<- noquote(Collated_Sims[, 1]) setwd(Output_Path) write.table(Collated_Sims, "Collated Sims.csv", sep=",", row.names=FALSE, quote=FALSE)
更简洁高效的替代写法
其实R里可以不用循环,用lapply批量读取文件再合并,代码更简洁且不易出错:
Inputs_Path <- "C:/MortgageSafe/Cirt2014-1/Sample" Output_Path <- "C:/MortgageSafe/Cirt2014-1/BatchOutput" # 读取所有CSV文件并合并 file_list <- list.files(path = Inputs_Path, full.names = TRUE) Collated_Sims <- do.call(rbind, lapply(file_list, read.csv, header = TRUE)) # 处理第一列 Collated_Sims[, 1] <- noquote(Collated_Sims[, 1]) # 输出结果 write.table(Collated_Sims, file.path(Output_Path, "Collated Sims.csv"), sep=",", row.names=FALSE, quote=FALSE)
这里用full.names = TRUE可以直接获取文件的完整路径,不用切换工作目录,更安全;do.call(rbind, ...)会把所有读取的数据框按行合并。
如果你的文件格式可能有差异,也可以用dplyr::bind_rows,它能自动处理列名不一致的情况:
library(dplyr) Collated_Sims <- bind_rows(lapply(file_list, read.csv, header = TRUE))
内容的提问来源于stack exchange,提问作者matrixfox
相关产品推荐
相关产品推荐

