R语言基于多列匹配规则用第二个dataframe的值替换目标dataframe的NA
R 多条件匹配填充缺失值方案
前置注意
你之前代码运行未达预期,大概率是因为示例中用cbind构造的是字符矩阵而非data.frame,先完成数据类型转换:
# 转换为data.frame并调整列类型 df1 <- as.data.frame(df1, stringsAsFactors = FALSE) df1$C <- as.integer(df1$C) df2 <- as.data.frame(df2, stringsAsFactors = FALSE) df2$C <- as.integer(df2$C)
方案1:Base R 实现
利用你确认的「A+B拼接值唯一匹配」的前提,直接匹配赋值:
# 生成匹配索引 match_pos <- match(paste(df2$A, df2$B), paste(df1$A, df1$B)) # 仅填充df2中C列为NA的位置 df2$C[is.na(df2$C)] <- df1$C[match_pos[is.na(df2$C)]]
方案2:dplyr 实现(更简洁,支持多列批量填充)
使用dplyr内置的rows_patch函数,专门用于通过主键匹配,用参考表的值填充目标表的缺失值,不会覆盖原有非缺失值:
library(dplyr) # by参数指定匹配主键,select里添加需要填充的所有列即可 df2 <- df2 %>% rows_patch(select(df1, A, B, C), by = c("A", "B"))
如果后续需要填充除C外的其他共有列,只需要在select中加入对应列名即可,无需修改其他逻辑。
内容的提问来源于stack exchange,提问作者Nino Pierantonio
相关产品推荐
相关产品推荐

