在R语言中基于银行名称匹配填充DataFrame的缺失银行代码
最佳实现方案:基于BANK-NAME匹配补全BANK-CODE
这是数据处理里非常典型的「匹配补全」需求,我给你分享两种在R里最常用的高效实现方式,你可以根据自己的工作流选择:
方法1:使用tidyverse/dplyr(推荐,代码清晰易维护)
如果你平时习惯用tidyverse生态的工具,这种方法可读性极强,后续扩展复杂操作也很方便:
library(dplyr) # 1. 左连接两个数据框,基于BANK-NAME匹配 # 用suffix区分两个表的BANK-CODE列 df_updated <- df2 %>% left_join(df1, by = "BANK-NAME", suffix = c("_df2", "_df1")) %>% # 2. 替换NA:仅当df2原有的BANK-CODE为NA时,用df1的对应值 mutate(BANK-CODE = case_when( is.na(BANK-CODE_df2) ~ BANK-CODE_df1, TRUE ~ BANK-CODE_df2 )) %>% # 3. 移除临时生成的辅助列 select(-BANK-CODE_df2, -BANK-CODE_df1)
运行后,df_updated里第4行的BANK-CODE就会被替换成B003,而那些在df1里找不到匹配的银行(比如Mizuho、Sberbank),BANK-CODE依然保持NA,完全符合你的需求。
方法2:使用Base R(无需额外包,轻量高效)
如果不想加载任何第三方包,用Base R的match()函数就能快速解决:
# 找到df2的BANK-NAME在df1中的对应位置 match_idx <- match(df2$BANK-NAME, df1$BANK-NAME) # 仅对df2中BANK-CODE为NA的行,用df1的BANK-CODE替换 df2$BANK-CODE[is.na(df2$BANK-CODE)] <- df1$BANK-CODE[match_idx[is.na(df2$BANK-CODE)]]
这个方法逻辑直接,运行速度快,适合数据量不大的场景。同样,找不到匹配的银行会保留NA值。
小提示
两种方法都会保留df2里原本非NA的BANK-CODE(如果有的话),只替换需要补全的NA值。如果你的数据里存在BANK-NAME大小写不一致的情况,可以先统一转成小写/大写再匹配,比如用tolower()函数处理列值。
内容的提问来源于stack exchange,提问作者Vadim Katsemba
相关产品推荐
相关产品推荐

