R语言按列名批量合并多个同结构数据框/CSV为单个表格
R 语言多同结构大型 CSV 纵向追加合并方案
适用于所有 CSV 列字段完全一致、需要按顺序逐表将行追加到前表末尾的场景,针对大文件做了效率优化,支持数十个甚至上百个文件的合并需求。
最高效方案(推荐大文件使用):data.table 实现
data.table的读写和行绑定性能远高于基础R和tidyverse,GB级文件合并速度是其他方案的5-10倍,内存占用更低。
- 先获取所有待合并文件的路径,按你需要的拼接顺序排序
# 首次使用先安装:install.packages("data.table") library(data.table) # 替换为你的CSV存放目录 csv_files <- list.files( path = "./your/csv/folder/path", pattern = "\\.csv$", # 匹配所有.csv后缀文件 full.names = TRUE ) # 按文件名排序,保证拼接顺序和你预期一致,可自定义排序规则 csv_files <- csv_files[order(basename(csv_files))] - 批量读取并合并
merged_data <- rbindlist( lapply(csv_files, fread), # fread为高速读入函数,自动识别列类型 use.names = TRUE, # 按列名匹配对齐,避免列顺序错乱导致数据错配 fill = FALSE # 列完全一致时设为FALSE,遇到缺列直接报错,不会悄悄生成NA脏数据 ) - 导出合并结果
fwrite(merged_data, "./merged_result.csv", bom = TRUE) # bom = TRUE 用于避免Excel打开时中文乱码,无中文场景可删除该参数
超大型文件流式合并方案(总文件大小超过内存时用):无需一次性读入所有文件,逐文件读入后直接追加写入磁盘,全程内存占用仅等于单个最大文件的大小
for (idx in seq_along(csv_files)) { current <- fread(csv_files[idx]) fwrite( x = current, file = "./merged_result.csv", append = idx != 1, # 第一个文件不追加,覆盖写 col.names = idx == 1, # 仅第一个文件写入表头 bom = idx == 1 ) rm(current) gc() # 释放内存 }
通用方案(习惯tidyverse语法可选)
适合中小文件合并,代码风格更简洁易读:
# 首次使用先安装:install.packages("tidyverse") library(tidyverse) csv_files <- list.files( path = "./your/csv/folder/path", pattern = "\\.csv$", full.names = TRUE ) %>% .[order(basename(.))] # 合并,加.id = "source"可以新增一列标记每行数据来自哪个文件,不需要可删除 merged_data <- map_dfr(csv_files, read_csv, .id = "source") write_csv(merged_data, "./merged_result.csv")
前置校验建议
合并前可以先校验所有文件列结构完全一致,避免脏数据导致合并错误:
# 提取所有文件的列名做比对 col_list <- lapply(csv_files, \(path) names(fread(path, nrows = 0))) # 列名不一致时直接终止运行并报错 stopifnot("存在文件列名不匹配,终止合并" = all(sapply(col_list, identical, col_list[[1]])))
合并顺序完全由csv_files向量的元素顺序决定,第一个路径对应文件的行在最前,最后一个路径对应文件的行在末尾,和需求的拼接逻辑完全匹配。
内容的提问来源于stack exchange,提问作者SpookyDLX
相关产品推荐
相关产品推荐

