如何用两个DataFrame的匹配数据填充目标DataFrame的SIC列且不覆盖
解决方法
基础R实现
先通过df2为df1填充SIC列,之后仅针对未匹配成功(值为NA)的行,用df3进行补全,彻底避免覆盖已匹配的结果:
# 第一步:从df2匹配填充SIC df1$SIC <- df2$SIC[match(df1$`Descr.Activity`, df2$Descr)] # 第二步:仅处理SIC为NA的行,用df3补全 na_rows <- is.na(df1$SIC) df1$SIC[na_rows] <- df3$SIC[match(df1$`Descr.Activity`[na_rows], df3$Descr)]
dplyr(tidyverse)简洁实现
如果习惯使用tidyverse工具链,可以通过两次左连接结合coalesce函数自动优先保留df2的匹配结果,再补充df3的内容:
library(dplyr) df1 <- df1 %>% # 关联df2获取对应SIC left_join(df2, by = c("Descr.Activity" = "Descr")) %>% # 关联df3获取另一组SIC,临时命名为SIC_df3 left_join(df3, by = c("Descr.Activity" = "Descr"), suffix = c("", "_df3")) %>% # 优先保留df2的SIC,无匹配时用df3的结果 mutate(SIC = coalesce(SIC, SIC_df3)) %>% # 移除临时生成的辅助列 select(-SIC_df3)
方法说明
- 基础R方案通过精准筛选未匹配的行,仅对这部分内容进行二次匹配,完全不会覆盖已从df2获取的有效数据;
- dplyr方案利用
coalesce函数自动选取第一个非NA值的特性,天然优先保留df2的匹配结果,再补充df3的内容; - 两种方案均无需合并df2和df3,完全满足需求。
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

