在R中如何基于serial与day字段对比两个df并标记缺失行?
实现方案
你之前使用inner_join失败的原因是该函数仅保留两个表中匹配成功的行,无法保留仅在单个表中存在的行,你需要使用全连接来实现需求,以下是两种常见实现方式:
1. dplyr包实现(推荐)
# 加载依赖包 library(dplyr) # 核心处理逻辑 result <- full_join( df1 %>% mutate(flag_df1 = TRUE), df2 %>% mutate(flag_df2 = TRUE), by = c("serial", "day") ) %>% mutate(compare = case_when( flag_df1 & flag_df2 ~ "两个表都存在", flag_df1 & is.na(flag_df2) ~ "仅在df1存在", is.na(flag_df1) & flag_df2 ~ "仅在df2存在" )) %>% select(-flag_df1, -flag_df2) # 移除辅助标记列
运行后输出结果完全符合预期:
| serial | day | compare |
|---|---|---|
| 1 | 1 | 两个表都存在 |
| 2 | 0 | 两个表都存在 |
| 3 | 1 | 两个表都存在 |
| 4 | 0 | 两个表都存在 |
| 5 | 0 | 两个表都存在 |
| 5 | 1 | 仅在df2存在 |
| 7 | 1 | 仅在df2存在 |
2. 基础R实现
如果不想加载第三方包,可以用基础R的merge函数实现:
# 先给两个表加来源标记 df1$flag_df1 <- 1 df2$flag_df2 <- 1 # 全连接合并 result_base <- merge(df1, df2, by = c("serial", "day"), all = TRUE) # 生成compare标记列 result_base$compare <- ifelse( !is.na(result_base$flag_df1) & !is.na(result_base$flag_df2), "两个表都存在", ifelse( !is.na(result_base$flag_df1), "仅在df1存在", "仅在df2存在" ) ) # 移除辅助列 result_base <- result_base[, !names(result_base) %in% c("flag_df1", "flag_df2")]
内容的提问来源于stack exchange,提问作者Rfanatic
相关产品推荐
相关产品推荐

