如何提取多份.dta文件名中的年份并添加到dataframe的新列中
适配.dta格式的低内存读取方案
核心优化点
- 移除预读取所有文件统计行数的冗余逻辑,每个文件仅读取1次,IO开销降低50%
- 年份列生成逻辑整合到单文件读取流程中,无需提前生成全局重复向量,内存占用大幅降低
- 适配.dta格式读取,使用高性能读取函数适配千万级观测规模
优化后代码
library(data.table) # 高性能数据读写、处理 library(purrr) # 迭代遍历 library(stringr) # 字符串处理 read_dta_with_year <- function(path, pattern = "*.dta", select = NULL) { # 获取目标路径下所有匹配的.dta文件 dta_file_list <- list.files(path, pattern = pattern, full.names = TRUE) # 遍历每个文件,读取后直接追加年份列再合并 map_dfr(dta_file_list, function(cur_file) { # 从当前文件名提取年份,可根据实际文件名格式调整str_sub的起止位置 # 示例适配文件名格式为 [任意字符]YYYY.dta,如survey_2020.dta file_year <- str_sub(cur_file, start = -8, end = -5) # 读取.dta文件,select参数可指定仅读取需要的列,大幅降低内存占用 cur_dt <- fread(cur_file, select = select) # 新增年份列 cur_dt[, year := file_year] return(cur_dt) }) } # 调用示例 # full_dt <- read_dta_with_year(path = "~/R/Data", select = c("id", "income", "education"))
如果偏好tidyverse语法,可将fread替换为haven::read_dta,读取逻辑保持一致。
注意事项
- 请根据你的实际文件名格式调整
str_sub的起止参数,确保可以正确提取年份信息 - 处理千万级观测时,强烈建议通过
select参数指定仅读取后续分析需要的列,避免无关变量占用内存 - 输出结果默认为data.table格式,如果需要转换为tibble,可在函数末尾追加
%>% as_tibble()
内容的提问来源于stack exchange,提问作者BossVom Schloss
相关产品推荐
相关产品推荐

