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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:18:00