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

如何提取多份.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:45:05