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
相关产品推荐
相关产品推荐

