使用rbindlist合并CSV文件时自动添加年份列的实现
解决方案
基于你现有的data.table代码,可以在读取每个文件时自动从文件名提取年份并添加为新列,修改后的完整代码如下:
library(data.table) files.to.read <- list.files(path = "./data", pattern = ".*\\.csv$", full.names = TRUE, recursive = FALSE) # 读取文件时同步添加年份列 L <- lapply(files.to.read, function(file) { # 读取当前文件 dt <- fread(file) # 从文件名提取年份:先获取不带路径的文件名,再匹配下划线后两位数字 year_suffix <- gsub(".*_(\\d{2})\\.csv$", "\\1", basename(file)) # 转换为完整年份(如19 → 2019)并添加为新列 dt[, year := as.integer(paste0("20", year_suffix))] return(dt) }) DT <- rbindlist(L, use.names = TRUE, fill = TRUE)
关键步骤说明:
- 提取纯文件名:用
basename(file)去掉文件路径,只保留文件名(比如./data/asdf_19.csv→asdf_19.csv) - 正则匹配年份后缀:
gsub(".*_(\\d{2})\\.csv$", "\\1", ...)精准捕获文件名最后一个下划线后的两位数字,作为年份后缀 - 生成完整年份:通过
paste0("20", year_suffix)将两位后缀转为4位完整年份,再转成整数保证数据格式规范 - 新增年份列:利用
data.table的直接赋值语法dt[, year := ...],给每个文件的数据集单独添加年份列,合并时自动保留该字段
如果你的文件名格式有变化(比如年份是4位数字、下划线位置不同),只需调整正则表达式即可。例如文件名是asdf_2019.csv时,可将正则改为".*_(\\d{4})\\.csv$",并去掉paste0("20", ...)步骤,直接转整数即可。
内容的提问来源于stack exchange,提问作者Gilrob
相关产品推荐
相关产品推荐

