基于文件路径字符串条件添加变量合并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
相关产品推荐
相关产品推荐

