如何使用R合并列名不同但格式统一的多份CSV文件为规范数据集
R实现不同列名CSV文件统一合并方案
需求说明
需要将指定文件夹下的所有CSV文件合并为一份通用CSV文件:
- 所有源文件均只有2列,第一列为编码,第二列为描述
- 不同源文件的两列列名不统一
- 最终输出需要使用统一规范列名,同时保留原始文件的列名信息
参考信息
文件夹操作参考代码
setwd("folder location") file1 <- read.csv("file1.csv") file2 <- read.csv("file2.csv")
可复现测试样例数据
file1 <- read.table(header=TRUE, text=" A_code A_desc n 15-24 n 15-24 n 15-24 t 25-34 p 35-44 k 65-74 l 45-54 ") file1 A_code A_desc 1 n 15-24 2 n 15-24 3 n 15-24 4 t 25-34 5 p 35-44 6 k 35-44 7 l 45-54 file2 <- read.table(header=TRUE, text=" M_code M_desc p new p new p new a old b medium b medium ") file2 M_code M_desc 1 p new 2 p new 3 p new 4 a old 5 b medium 6 b medium
期望输出结构
Gen_code Gen_Desc Ori_code Ori_desc 1 n 15-24 A_code A_desc 2 n 15-24 A_code A_desc 3 n 15-24 A_code A_desc 4 t 25-34 A_code A_desc 5 p 35-44 A_code A_desc 6 k 65-74 A_code A_desc 7 l 45-54 A_code A_desc 8 p new M_code M_desc 9 p new M_code M_desc 10 p new M_code M_desc 11 a old M_code M_desc 12 b medium M_code M_desc 13 b medium M_code M_desc
已尝试错误代码
原有代码未做列名统一转换,也没有新增原始列名字段,运行结果不符合预期:
path="folder location" directory() %>% filter(endsWith(path, ".csv")) %>% select(path) %>% mutate(data = purrr::map(path, read_csv)) %>% unnest()
正确实现代码
# 加载依赖包 library(tidyverse) # 配置目标文件夹路径 target_path <- "folder location" # 合并逻辑 final_merged_data <- list.files(path = target_path, pattern = "\\.csv$", full.names = TRUE) %>% tibble(file_path = .) %>% mutate(data = purrr::map(file_path, function(curr_file) { # 读取当前CSV文件 curr_df <- read_csv(curr_file, show_col_types = FALSE) # 提取当前文件的原生列名 original_cols <- colnames(curr_df) # 重命名为统一列名,同时新增原始列名字段 curr_df %>% rename(Gen_code = all_of(original_cols[1]), Gen_Desc = all_of(original_cols[2])) %>% mutate(Ori_code = original_cols[1], Ori_desc = original_cols[2]) })) %>% unnest(cols = data) %>% # 按要求调整字段顺序 select(Gen_code, Gen_Desc, Ori_code, Ori_desc) # 导出合并结果为CSV write_csv(final_merged_data, "merged_unified.csv")
代码说明
- 自动匹配目标文件夹下所有csv格式文件,无需手动逐个指定
- 遍历读取文件时自动适配不同的原始列名,按第一列为编码、第二列为描述的规则做统一转换
- 新增
Ori_code和Ori_desc字段存储对应文件的原始列名,完全匹配期望的输出结构 - 最终结果可直接导出为标准CSV文件使用
内容的提问来源于stack exchange,提问作者S Das
相关产品推荐
相关产品推荐

