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

基于文件路径字符串条件添加变量合并CSV文件的R实现问询

批量读取合并CSV并从路径提取分组信息

先生成测试文件(用于验证方案)

# 创建嵌套目录结构
dir.create("Dataset_1/Cohort_1", recursive = TRUE)
dir.create("Dataset_1/Cohort_2")
dir.create("Dataset_2/Cohort_1")

# 生成测试CSV数据(固定随机数方便复现)
set.seed(123)
write.csv(data.frame(Value = rnorm(5)), "Dataset_1/Cohort_1/Grouping_1_Data.csv", row.names = FALSE)
write.csv(data.frame(Value = rnorm(5)), "Dataset_1/Cohort_1/Grouping_2_Data.csv", row.names = FALSE)
write.csv(data.frame(Value = rnorm(5)), "Dataset_1/Cohort_2/Grouping_1_Data.csv", row.names = FALSE)
write.csv(data.frame(Value = rnorm(5)), "Dataset_2/Cohort_1/Grouping_1_Data.csv", row.names = FALSE)

方案1:使用tidyverse(推荐,代码更简洁)

依赖purrr(遍历处理)、readr(快速读CSV)和stringr(路径提取):

library(tidyverse)

# 递归获取所有CSV文件的完整路径
csv_paths <- list.files(path = ".", pattern = "\\.csv$", recursive = TRUE, full.names = TRUE)

# 遍历读取并合并,同时添加分组列
combined_data <- map_df(csv_paths, function(file_path) {
  # 从路径中提取分组标识
  dataset <- str_extract(file_path, "Dataset_\\d+")
  cohort <- str_extract(file_path, "Cohort_\\d+")
  grouping <- str_extract(file_path, "Grouping_\\d+")
  
  # 读取CSV并追加分组列
  read_csv(file_path) %>%
    mutate(
      Dataset = dataset,
      Cohort = cohort,
      Grouping = grouping
    )
})

# 查看合并结果
head(combined_data)

关键说明:

  • map_df会自动将所有返回的数据框按行合并,无需额外绑定操作
  • 正则表达式"Dataset_\\d+"匹配Dataset_加数字的格式,若命名规则有变化,可调整正则(比如支持字母:"Dataset_\\w+")

方案2:使用Base R(无额外依赖)

如果不想加载tidyverse包,用Base R原生函数实现:

# 获取所有CSV文件路径
csv_paths <- list.files(path = ".", pattern = "\\.csv$", recursive = TRUE, full.names = TRUE)

# 遍历处理每个文件
data_list <- lapply(csv_paths, function(file_path) {
  # 分割路径为各层级
  path_segments <- strsplit(file_path, "/")[[1]]
  
  # 提取分组信息
  dataset <- path_segments[grepl("Dataset_", path_segments)]
  cohort <- path_segments[grepl("Cohort_", path_segments)]
  # 从文件名提取Grouping(去掉后缀)
  grouping <- gsub("_Data\\.csv$", "", path_segments[length(path_segments)])
  
  # 读取CSV并添加分组列
  df <- read.csv(file_path)
  df$Dataset <- dataset
  df$Cohort <- cohort
  df$Grouping <- grouping
  return(df)
})

# 合并所有数据框
combined_data_base <- do.call(rbind, data_list)

# 查看结果
head(combined_data_base)

关键说明:

  • strsplit将路径按/分割成片段,用grepl筛选出包含分组标识的片段
  • gsub用于清理文件名,去掉_Data.csv后缀得到Grouping名称

注意事项

  • 确保所有CSV文件的列结构完全一致,否则合并会报错(你已说明结构固定,可忽略此警告)
  • 若路径中存在同名分组标识(比如文件名包含Dataset_),可调整正则为"(?<=/)Dataset_\\d+",确保只匹配路径层级中的分组

内容的提问来源于stack exchange,提问作者TDeramus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:13:14