如何编写R函数对比两个data frame列名匹配情况并生成汇总结果
R实现双数据框列名校验与差异合并函数
实现思路
- 第一步:提取两个数据框的列名,计算共有列、各自独有列,生成匹配情况汇总
- 第二步:对列名完全匹配的列,按行合并两个数据框的对应列内容,增加来源标记方便溯源
- 第三步:对两边独有的列,统一转换为「列名-值-来源」的长表结构后按行绑定,方便快速查看所有差异列信息
完整函数代码
merge_df_with_col_check <- function(df_a, df_b) { # 1. 列名匹配校验 cols_a <- colnames(df_a) cols_b <- colnames(df_b) common_cols <- intersect(cols_a, cols_b) only_a_cols <- setdiff(cols_a, cols_b) only_b_cols <- setdiff(cols_b, cols_a) # 生成匹配汇总 col_match_summary <- list( 完全匹配列数 = length(common_cols), 匹配列名 = common_cols, 第一个数据框独有列数 = length(only_a_cols), 第一个数据框独有列名 = only_a_cols, 第二个数据框独有列数 = length(only_b_cols), 第二个数据框独有列名 = only_b_cols ) # 2. 匹配列合并 common_merged <- rbind( cbind(df_a[, common_cols, drop = FALSE], 来源数据框 = "df"), cbind(df_b[, common_cols, drop = FALSE], 来源数据框 = "df1") ) rownames(common_merged) <- NULL # 3. 不匹配列整理合并 # 处理第一个数据框独有列 only_a_df <- data.frame() if (length(only_a_cols) > 0) { a_sub <- df_a[, only_a_cols, drop = FALSE] only_a_df <- data.frame( 列名 = rep(colnames(a_sub), each = nrow(a_sub)), 值 = unlist(a_sub, use.names = FALSE), 来源数据框 = "df独有", stringsAsFactors = FALSE ) rownames(only_a_df) <- NULL } # 处理第二个数据框独有列 only_b_df <- data.frame() if (length(only_b_cols) > 0) { b_sub <- df_b[, only_b_cols, drop = FALSE] only_b_df <- data.frame( 列名 = rep(colnames(b_sub), each = nrow(b_sub)), 值 = unlist(b_sub, use.names = FALSE), 来源数据框 = "df1独有", stringsAsFactors = FALSE ) rownames(only_b_df) <- NULL } uncommon_merged <- rbind(only_a_df, only_b_df) # 返回所有结果 return(list( 列名匹配汇总 = col_match_summary, 匹配列合并结果 = common_merged, 非匹配列合并结果 = uncommon_merged )) }
测试示例
# 测试数据 df <- data.frame(EXT=c(1),MAN=c(2),MANi=c(2),nune=c(2),klay=c(4),emial=c("dd"),Pass=c(99),fri=c("TGA"), mkl=c("nhi"),kin=c(7),munc=c(6),lone=c(44),wond=c("tko")) df1 <- data.frame(EXT=c(1),MAN=c(2),MANi=c(2),nune=c(2),klay=c(4),emial=c("dd"),PASS=c(99),fri=c("TGA"), mkl=c("nhi"),kin=c(7),MUNC=c(6),lone=c(44),hulu=c("kra"),kone=("hab")) # 调用函数 result <- merge_df_with_col_check(df, df1)
结果查看
- 查看列名匹配汇总:
print(result$列名匹配汇总)
运行后可看到匹配列数为10,df独有3列:Pass、munc、wond,df1独有4列:PASS、MUNC、hulu、kone,完全符合测试数据的大小写差异情况 - 查看匹配列合并结果:
View(result$匹配列合并结果)
返回2行11列的表格,包含10个匹配列+来源标记,两个数据框的匹配内容按行拼接 - 查看非匹配列合并结果:
View(result$非匹配列合并结果)
返回7行长表,包含所有独有的列的名称、取值和来源,可直接查看所有列名差异对应的数据
内容的提问来源于stack exchange,提问作者coder2learn
相关产品推荐
相关产品推荐

