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

R语言对比两个data frame数据一致性并输出差异结果咨询

R实现两个结构不同DataFrame的全量对比方案

实现思路

  • 先校验两个数据集的列名差异:找出仅存在于df1/df2的列
  • 对共有的列,逐行逐值对比内容差异,支持行列数不一致的场景
  • 最终输出包含所有不一致信息的结果表

完整实现代码

首先确认已加载tidyverse依赖包,在你已有的预处理代码基础上补充如下逻辑:

library(tidyverse)

# 1. 提取列名差异
col_only_df1 <- setdiff(names(df1), names(df2))
col_only_df2 <- setdiff(names(df2), names(df1))
col_diff <- tibble(
  差异类型 = "列名差异",
  仅在df1存在的列 = ifelse(length(col_only_df1)==0, "无", paste(col_only_df1, collapse = ",")),
  仅在df2存在的列 = ifelse(length(col_only_df2)==0, "无", paste(col_only_df2, collapse = ",")),
  行号 = NA_character_,
  列名 = NA_character_,
  df1值 = NA_character_,
  df2值 = NA_character_
)

# 2. 给原始数据集加行号,定位差异位置
df1_with_id <- df1 %>% mutate(row_id = row_number())
df2_with_id <- df2 %>% mutate(row_id = row_number())

# 3. 对比共有列的内容差异
common_cols <- intersect(names(df1), names(df2))
value_diff <- full_join(
  df1_with_id %>% select(row_id, all_of(common_cols)) %>% 
    pivot_longer(-row_id, names_to = "列名", values_to = "df1值"),
  df2_with_id %>% select(row_id, all_of(common_cols)) %>% 
    pivot_longer(-row_id, names_to = "列名", values_to = "df2值"),
  by = c("row_id", "列名")
) %>% 
  filter(df1值 != df2值 | is.na(df1值) | is.na(df2值)) %>% 
  mutate(
    差异类型 = case_when(
      is.na(df2值) ~ "仅df1存在该行",
      is.na(df1值) ~ "仅df2存在该行",
      TRUE ~ "值不匹配"
    )
  ) %>% 
  select(差异类型, 行号 = row_id, 列名, df1值, df2值)

# 4. 合并所有差异为最终结果dataframe
final_diff_result <- bind_rows(col_diff, value_diff)

结果使用说明

  • final_diff_result包含全量不一致信息,共三类差异:
    • 列名差异:两个数据集列名不对齐的情况
    • 仅df1/df2存在该行:因行数不一致导致的单侧缺失行
    • 值不匹配:同一行号同一列下的内容差异,你示例数据中的emial列大小写差异、mkl列全称/简写差异、MANi列大小写差异都会被单独列出
  • 可直接筛选查看指定类型的差异:
# 快速查看所有内容值不匹配的条目
filter(final_diff_result, 差异类型 == "值不匹配")

内容的提问来源于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:36:01