如何用dplyr实现含NA的DataFrame列合并left_join操作?
用dplyr填充DataFrame中缺失的result值
嘿,这个需求用dplyr完全可以优雅解决,不用写烦人的循环,给你两种实用的方法,刚好匹配你的场景:
先确认原始数据
首先咱们先把你提供的可复现代码放出来,方便后续验证:
library(dplyr) df_main <- tibble(UID = c(1,2,3,4,5), foo=c("moo", "rum", "oink", "woof", "hiss"), result=c("Cow", NA, NA, "Dog", NA)) new_prediction <- tibble(UID = c(3,5), result = c("Pig", "Snake"))
方法1:left_join + coalesce(通用兼容版)
这种方法适合所有版本的dplyr,逻辑清晰:先通过UID做左连接,再用coalesce函数优先保留原始非NA值,用预测值填充缺失的部分,最后清理多余的列:
df_updated <- df_main %>% # 左连接,给预测列加后缀区分 left_join(new_prediction, by = "UID", suffix = c("", "_pred")) %>% # coalesce会取第一个非NA的值,完美实现"原始值保留,NA用预测值填充" mutate(result = coalesce(result, result_pred)) %>% # 删掉临时的预测列 select(-result_pred) # 查看结果 df_updated
方法2:rows_patch(dplyr 1.0.0+ 简洁版)
如果你用的是dplyr 1.0.0及以上版本,rows_patch是专门为这种场景设计的函数——它会根据匹配的键(这里是UID),用右侧数据框的值去填充左侧数据框的缺失值,一步到位:
df_updated <- df_main %>% rows_patch(new_prediction, by = "UID") # 查看结果 df_updated
最终结果
两种方法都会得到同样的输出:
# A tibble: 5 × 3 UID foo result <dbl> <chr> <chr> 1 1 moo Cow 2 2 rum NA 3 3 oink Pig 4 4 woof Dog 5 5 hiss Snake
可以看到:
- 原始有值的
result(UID=1、4)完全保留 - 原始为NA且有预测值的
result(UID=3、5)被成功填充 - 原始为NA且无预测值的
result(UID=2)依然保持NA,符合左连接的预期
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

