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

R语言合并多个CSV文件时如何简便添加文件名作为新变量?

批量合并CSV并添加文件名列的简便实现

待处理CSV文件列表如下:

"2022-01-07.csv" 
"2022-01-11.csv"
"2022-01-14.csv"
"2022-01-21.csv" 
"2022-02-08.csv" 
"2022-02-17.csv" 
"2022-02-21.csv"

你之前写的for循环可以实现需求,但需要手动初始化空数据框、维护循环索引、逐次合并数据,效率和简洁度都一般。用tidyverse里的purrr函数可以用极简的核心逻辑完成全部操作,不需要显式写循环。

方法1:利用map_dfr的.id参数直接生成文件名列

map_dfr()会自动将所有读取结果按行合并为数据框,搭配.id参数可以直接给每一行数据标记来源,只需要提前给文件路径向量命名即可:

library(tidyverse)

# 建议加pattern参数,仅匹配csv后缀文件,避免读到目录下其他类型文件
files <- list.files(pattern = "\\.csv$")
# 将向量的名称设置为对应文件名,供.id参数读取
names(files) <- files

total_file <- map_dfr(files, read.csv, .id = "filename")

方法2:map内灵活处理后批量合并

如果读取单个文件时需要额外做数据清洗(比如筛选行、转换列类型、重命名字段),可以直接在map的匿名函数里完成处理,再统一合并,扩展性更强:

library(tidyverse)

total_file <- list.files(pattern = "\\.csv$") %>% 
  map(~ {
    # 单文件处理逻辑,可按需扩展
    df <- read.csv(.x)
    df$filename <- .x
    return(df)
  }) %>% 
  # 新版purrr用list_rbind做行合并,效率高于逐次bind_rows
  list_rbind()

两种写法都不需要手动初始化空数据框,也不会出现循环里逐次合并导致的重复内存拷贝问题,运行速度比原for循环更快。如果处理的文件体积较大,可以把基础包的read.csv替换为readr包的read_csv,读取速度会有明显提升。

内容的提问来源于stack exchange,提问作者anderwyang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:12:32