如何在RStudio中从多目录批量导入多CSV文件至同一数据集
批量导入多日期目录下的CSV并合并成带日期标识的数据表
当然可以一次性搞定这个需求!我经常处理这种按日期分目录的批量数据,给你两种常用的解决方案,分别适配基础R和tidyverse生态,你可以根据自己的习惯选择:
方案一:用tidyverse工具链(推荐,代码更简洁易读)
首先确保你安装并加载了tidyverse包(包含readr、dplyr、purrr这些实用工具):
install.packages("tidyverse") library(tidyverse)
步骤1:获取所有CSV文件的完整路径
用list.files的recursive = TRUE参数遍历所有子目录,full.names = TRUE保留完整路径(方便后续提取日期信息):
all_csv_files <- list.files( path = ".", # 这里替换成你的根目录路径,比如"/home/your_data/raw" pattern = "\\.csv$", # 正则匹配.csv结尾的文件,避免误匹配临时文件 recursive = TRUE, full.names = TRUE )
步骤2:从路径中提取日期标识
假设你的日期目录是YYYY-MM-DD格式(比如2024-05-20),可以用stringr包的str_extract直接提取日期字符串:
# 提取路径中的日期部分 date_labels <- str_extract(all_csv_files, "\\d{4}-\\d{2}-\\d{2}")
如果你的日期格式是其他样式(比如MM-DD-YYYY),只需要调整正则表达式即可,比如改成"\\d{2}-\\d{2}-\\d{4}"。
步骤3:批量读取并合并数据
用map_df一次性读取所有文件,并自动合并成一个数据框,同时添加日期列:
combined_data <- map_df( all_csv_files, ~read_csv(.x), # 读取单个CSV文件 .id = "file_index" # 生成临时索引,用来匹配对应的日期 ) %>% mutate(date = date_labels[as.integer(file_index)]) %>% # 添加日期列 select(-file_index) # 移除临时索引列
如果不同CSV的列名不一致,可以加上.fill = TRUE参数自动填充缺失列的NA值:
combined_data <- map_df( all_csv_files, ~read_csv(.x), .id = "file_index", .fill = TRUE ) %>% mutate(date = date_labels[as.integer(file_index)]) %>% select(-file_index)
方案二:基础R实现(无需额外包)
如果你习惯用基础R,可以这样操作:
# 1. 获取所有CSV文件路径 all_csv_files <- list.files( path = ".", pattern = "\\.csv$", recursive = TRUE, full.names = TRUE ) # 2. 提取日期目录名(假设日期是最后一级目录) date_labels <- sapply( strsplit(dirname(all_csv_files), "/"), # 拆分路径字符串 tail, 1 # 取最后一级目录名(即日期) ) # 3. 批量读取并添加日期列 data_list <- lapply(seq_along(all_csv_files), function(i) { # 读取CSV(基础R用read.csv,如果你习惯readr的read_csv也可以替换) df <- read.csv(all_csv_files[i], stringsAsFactors = FALSE) # 给当前数据框添加日期列 df$date <- date_labels[i] return(df) }) # 4. 合并所有数据框 combined_data <- do.call(rbind, data_list)
额外优化建议
- 大文件处理:如果你的CSV文件体积很大,推荐用
data.table包的fread,速度比read_csv和read.csv快很多:install.packages("data.table") library(data.table) combined_data <- rbindlist( lapply(all_csv_files, fread), fill = TRUE # 处理列不一致的情况 ) combined_data$date <- date_labels - 日期格式转换:提取的日期是字符串,你可以转成日期类型方便后续分析:
combined_data$date <- as.Date(combined_data$date)
内容的提问来源于stack exchange,提问作者michmont
相关产品推荐
相关产品推荐

