如何用另一dataframe值更新现有数据框列,合并唯一值不新增记录
问题与解决方案
原始数据
你拥有两个DataFrame:
DF1<-data.frame(name = c("Test1","Test2","Test3"), Value = c(10,20,30), Remarks = c("Good","Best","Perfect") )
DF2<- data.frame(name = c("Test","Test2","Test3","Test4"), Value = c(10,22,30, 40), Remarks = c("Good","Best","Perfect","NEW"))
你的需求是:合并两个DataFrame,保留所有唯一name记录;对于重复的name,用DF2的值覆盖DF1,最终结果无重复条目。而unique(bind_rows(x = DF1, y = DF2))会产生重复记录,无法满足需求。
方法1:bind_rows + distinct(简单直接)
先按「DF1在前、DF2在后」的顺序合并,再按name去重,保留每个name最后出现的记录(即DF2的更新值):
library(dplyr) DF3 <- bind_rows(DF1, DF2) %>% distinct(name, .keep_all = TRUE) %>% arrange(name) # 可选:按name排序,优化结果可读性
最终结果
name Value Remarks 1 Test 10 Good 2 Test1 10 Good 3 Test2 22 Best 4 Test3 30 Perfect 5 Test4 40 NEW
方法2:rows_update + bind_rows(逻辑更严谨)
明确区分「更新已有记录」和「添加新记录」两个步骤:
library(dplyr) # 用DF2更新DF1中重复的name记录 updated_DF1 <- rows_update(DF1, DF2, by = "name", unmatched = "ignore") # 提取DF2中DF1没有的新记录 new_records <- anti_join(DF2, DF1, by = "name") # 合并更新后的DF1和新记录 DF3 <- bind_rows(updated_DF1, new_records) %>% arrange(name)
此方法结果与方法1完全一致,适合需要清晰区分更新/新增逻辑的场景。
内容的提问来源于stack exchange,提问作者Lakshmikanth
相关产品推荐
相关产品推荐

