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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:03:13