在R中读取并合并多个CSV时如何添加文件名作为列
批量合并CSV并添加文件名列的解决方案
需求说明
需要读取数千份列结构一致的CSV文件,合并后保存为RDS文件,同时为每条数据添加来源文件名列,用于区分数据的原始文件。
示例CSV生成代码
# 生成示例CSV文件 mtcars_slim <- select(mtcars, 1:3) write_csv(slice(mtcars_slim, 1:4), "Input data/sub folder/AA_1.csv") write_csv(slice(mtcars_slim, 5:10), "Input data/sub folder/AAA_2.csv") write_csv(slice(mtcars_slim, 11:1), "Input data/sub folder/BBB_3.csv")
已尝试的有效代码(无文件名列)
这段代码可以成功合并CSV,但缺少数据来源的文件名信息:
# 可运行但无文件名列的代码 list.files(path = "Input data/sub folder/", pattern="*.csv", full.names = T) %>% map_df(~read_csv(.)) %>% saveRDS("output_compiled_data.rds")
失败的尝试代码
尝试添加文件名列但逻辑错误:
file_names <- list.files(path = "Input data/sub folder/", pattern="*.csv", full.names = T) %>% map_df(file_names, ~read_csv(.) %>% mutate(symbol = file_names)) %>% saveRDS("output_compiled_data.rds") data_tbl <- read_rds("output_compiled_data.rds") data_tbl
正确解决方案
问题出在map_df的用法错误,且赋值文件名时未引用当前循环的文件路径。正确代码如下:
# 正确代码:合并CSV并添加文件名列 list.files(path = "Input data/sub folder/", pattern = "*.csv", full.names = TRUE) %>% map_df(function(file_path) { read_csv(file_path) %>% mutate(source_file = basename(file_path)) # basename()提取纯文件名,需完整路径则直接用file_path }) %>% saveRDS("output_compiled_data.rds") # 验证结果 data_tbl <- read_rds("output_compiled_data.rds") print(data_tbl)
代码说明
- 用匿名函数接收每个文件路径,确保每份CSV对应正确的来源文件名
basename(file_path)提取路径中的纯文件名(如AA_1.csv),若需保留完整文件路径,直接替换为source_file = file_path即可- 保留原代码的管道式风格,同时修复了文件名赋值错误的问题
内容的提问来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

