R语言循环读取指定CSV文件仅获最后一个文件,求排查解决
解决R循环读取CSV仅保留最后一个文件的问题
嘿,我来帮你搞定这个问题!你的代码问题很明确:每次循环都在覆盖同一个变量mydata。当你执行mydata <- data.frame(read.csv(x[i]))时,每一次迭代都会把之前存在mydata里的数据替换掉,所以循环结束后自然只剩下最后一次读取的004.csv的数据啦。
下面给你两种常用的解决方案,根据你的需求来选:
方案1:将每个文件的数据存储为列表(推荐,方便单独处理单个文件)
这种方式会把每个CSV文件的数据单独存在列表的一个元素里,后续你可以轻松调用任意一个文件的数据:
# 先筛选出所有CSV文件,避免读取非CSV文件 file_list <- list.files(pattern = "\\.csv$") # 初始化一个空列表用来存储数据 mydata_list <- list() # 循环读取每个文件并存入列表 for (i in 1:length(file_list)) { mydata_list[[i]] <- read.csv(file_list[i]) # 给列表元素加上文件名,方便后续识别调用 names(mydata_list)[i] <- file_list[i] }
之后你可以通过mydata_list[["001.csv"]]或者mydata_list[[1]]来调用第一个文件的数据,非常灵活。
方案2:合并所有文件为一个大的数据框(适合所有文件结构一致的情况)
如果你的所有CSV文件列名、列结构都完全相同,想把它们合并成一个整体的数据框,可以这么做:
方法一:用循环逐步合并
file_list <- list.files(pattern = "\\.csv$") # 先读取第一个文件作为初始数据 mydata <- read.csv(file_list[1]) # 从第二个文件开始循环合并 for (i in 2:length(file_list)) { temp_data <- read.csv(file_list[i]) mydata <- rbind(mydata, temp_data) }
方法二:用lapply+do.call更简洁高效
R里的函数式编程可以让代码更简洁,尤其是文件数量多的时候:
file_list <- list.files(pattern = "\\.csv$") # 一次性读取所有文件并合并 mydata <- do.call(rbind, lapply(file_list, read.csv))
另外补充个小建议:原来的list.files()可能会读取目录下的非CSV文件,加上pattern = "\\.csv$"可以确保只获取后缀为.csv的文件,避免出错。
内容的提问来源于stack exchange,提问作者Pulkit Chaturvedi
相关产品推荐
相关产品推荐

