You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:10:38