在R语言中合并多份CSV文件并添加文件名列的技术求助
嘿,你的需求其实很常见,而且你一开始选ldply的思路是对的,只是函数体没写完而已!我来帮你把代码补全,再给你几个更实用的方案~
解决CSV合并并添加文件名列的问题
方法1:补全你正在用的plyr代码
你的脚本里ldply的匿名函数没写完,而且有个关键细节:要把full.names设为TRUE,这样才能拿到文件的完整路径,不然read.csv可能找不到文件(毕竟你的工作目录不一定是CSV文件夹)。修改后的完整代码如下:
library(plyr) # 获取CSV文件的完整路径(一定要开full.names=TRUE!) csvfilenames <- list.files("/Users/PAM/Desktop/CSVFilesToMerge/", pattern="*.csv", all.files=FALSE, full.names=TRUE) # 合并文件并新增文件名列 CombinedData <- ldply(csvfilenames, function(filepath) { # 读取当前CSV文件 data <- read.csv(filepath, stringsAsFactors = FALSE) # 提取纯文件名(去掉前面的路径),添加为新列 data$source_file <- basename(filepath) return(data) }) # 查看合并后的前几行数据 head(CombinedData)
方法2:更现代的tidyverse方案(推荐)
plyr已经停止维护啦,现在更推荐用tidyverse家族的dplyr+purrr组合,代码更简洁,处理大文件也更快:
library(tidyverse) # 同样先获取完整文件路径 csvfilenames <- list.files("/Users/PAM/Desktop/CSVFilesToMerge/", pattern="*.csv", full.names=TRUE) # 一步完成读取、合并、加文件名列 CombinedData <- csvfilenames %>% set_names() %>% # 用文件名给列表元素命名 map_dfr(read_csv, .id = "source_file") # 自动合并,.id直接把列表名转成新列
这里用read_csv代替read.csv,它是readr包的函数,默认支持UTF-8编码,读取速度也比基础函数快很多哦~
方法3:基础R实现(不用装任何包)
如果你不想依赖第三方包,用基础R的循环也能搞定,只是处理大量文件时效率会低一点:
# 获取完整文件路径 csvfilenames <- list.files("/Users/PAM/Desktop/CSVFilesToMerge/", pattern="*.csv", full.names=TRUE) # 初始化空数据框 CombinedData <- data.frame() # 循环读取每个文件并合并 for (filepath in csvfilenames) { data <- read.csv(filepath, stringsAsFactors = FALSE) data$source_file <- basename(filepath) CombinedData <- rbind(CombinedData, data) } # 查看结果 head(CombinedData)
几个要注意的小细节
- 确保所有CSV文件的列名和列数完全一致,不然合并时会报错;
- 如果你的CSV是特殊编码(比如中文UTF-8),可以在
read.csv里加fileEncoding="UTF-8",或者直接用read_csv(默认支持UTF-8); - 可以先打印
csvfilenames确认路径是否正确,避免找不到文件的问题。
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

