在R中批量导入子文件夹CSV并添加父文件夹名称列
解决方案
直接用purrr::map_dfr结合路径提取的方式,就能实现批量导入并添加日期列,最终合并成适合跨日期对比的长格式数据集:
library(tidyverse) # 目标数据路径 data_path <- "/Users/cevieth/Desktop/*MTL Rental Research/Rstats Coding/StatsCan and Air BnB Coding/Inside Air BnB Data" # 获取所有listings.csv的完整路径 airbnb_files <- list.files( path = data_path, pattern = "listings.csv", recursive = TRUE, full.names = TRUE ) # 批量导入、添加日期列并合并 airbnb_combined <- map_dfr(airbnb_files, function(file_path) { # 从文件路径中提取父文件夹的日期名称 date_label <- basename(dirname(file_path)) read_csv(file_path) %>% # 添加Date列,值为对应文件夹的日期;.after可选,用于指定列的位置 mutate(Date = date_label, .after = id) })
关键步骤说明
- 路径提取日期:
basename(dirname(file_path))是核心逻辑——dirname()获取文件的父目录路径,basename()提取该路径的最后一段(也就是你需要的日期文件夹名称)。 - 高效合并:
map_dfr()会自动将每个导入的数据框按行合并(等价于lapply()+bind_rows()),比你之前用的full_join更适合这个场景(full_join会把同id的记录合并成一行,变成宽格式,不利于跨日期对比分析)。 - 日期格式转换(可选):如果需要把
Date列转为标准日期格式,直接修改mutate语句:mutate(Date = as.Date(date_label), .after = id)
额外优化建议
- 用
here::here()管理路径,避免硬编码绝对路径,项目移动后无需修改路径:library(here) data_path <- here("Inside Air BnB Data") - 大文件场景下,用
vroom::vroom()替代read_csv,导入速度提升数倍:library(vroom) # 将read_csv(file_path)替换为vroom(file_path) - 添加进度条,方便查看导入进度:
airbnb_combined <- map_dfr(airbnb_files, function(file_path) { # ... 原有代码 ... }, .progress = TRUE)
内容的提问来源于stack exchange,提问作者Rine
相关产品推荐
相关产品推荐

