R语言快速比较相同结构dataframe并输出指定差异结果的方法
你之前的代码无法正常运行的核心原因有两个:
- 直接用
==比较无法处理NA值:R中NA和任意值(包括NA本身)做==判断都会返回NA,无法正确识别两个单元格均为NA的相等场景 - 语法逻辑错误:
apply函数缺少必要参数,且该场景完全不需要循环类操作,直接向量化运算即可实现。
下面是两种可直接运行的实现方案:
方案1:基础R极简实现(无第三方依赖)
如果ID列为第一列,可直接用以下一行代码实现:
result <- cbind(df1[1], ifelse(df1[-1] == df2[-1] | (is.na(df1[-1]) & is.na(df2[-1])), NA, df2[-1]))
如果ID列位置不固定,可指定列名处理:
cmp_cols <- setdiff(names(df1), "ID") result <- cbind(df1["ID"], ifelse(df1[cmp_cols] == df2[cmp_cols] | (is.na(df1[cmp_cols]) & is.na(df2[cmp_cols])), NA, df2[cmp_cols]))
方案2:dplyr优雅实现
适合已经在使用tidyverse生态的场景,代码可读性更高:
library(dplyr) result <- df2 %>% mutate(across(-ID, ~ifelse(.x == df1[[cur_column()]] | (is.na(.x) & is.na(df1[[cur_column()]])), NA, .x)))
两种方案运行后得到的结果都和你给出的预期输出完全一致:
> result ID A B 1 1 NA NA 2 2 NA NA 3 3 NA 3 4 4 4 NA
内容的提问来源于stack exchange,提问作者Karol
相关产品推荐
相关产品推荐

