连接两个数据帧并覆盖匹配行[R]

连接两个数据帧并覆盖匹配行[R],r,dataframe,R,Dataframe,我环顾四周,发现了很多类似的问题,但都没有回答我的问题,就这样 我希望按列连接R中的两个数据帧(如rbind),并让第二个表覆盖第一列的匹配值,这样第一列的值就不会重复 我想这样做: a<-data.frame(c("Foo", "Moo", "Boo"), c(1, 2, 3), stringsAsFactors=F) colnames(a)<-c("Name", "Value") b<-data.frame(c("Boo", "Bar", "Bat"), c(11, 12,

我环顾四周,发现了很多类似的问题,但都没有回答我的问题,就这样

我希望按列连接R中的两个数据帧(如rbind),并让第二个表覆盖第一列的匹配值,这样第一列的值就不会重复

我想这样做:

a<-data.frame(c("Foo", "Moo", "Boo"), c(1, 2, 3), stringsAsFactors=F)
colnames(a)<-c("Name", "Value")
b<-data.frame(c("Boo", "Bar", "Bat"), c(11, 12, 13), stringsAsFactors=F)
colnames(b)<-c("Name", "Value")

rbind_and_overwrite(a, b)

# Output
#             Name         Value
# 1           Foo          1
# 2           Moo          2
# 3           Boo          11
# 4           Bar          12
# 5           Bat          13

a我只需在%
中使用
%来测试b中a中不存在的
Name
s,然后只测试
rbind()
这些行到
a

rbind(a, b[!b$Name %in% a$Name,])
#    Name Value
# 1   Foo     1
# 2   Moo     2
# 3   Boo     3
# 21  Bar    12
# 31  Bat    13

我玩游戏有点晚了,但考虑到OP,接受的答案实际上是不正确的:它不会覆盖匹配的行,而是保留原始行(示例中的第3行:Boo,3)

我不能想出一个优雅的解决方案,我能做的最好的是这个dplyr管道,但它正确地完成了工作:

library(dplyr)
> a %>% 
+   filter(!Name %in% b$Name) %>% 
+   bind_rows(b)
  Name Value
1  Foo     1
2  Moo     2
3  Boo    11
4  Bar    12
5  Bat    13

现在看起来很简单!要让b名称覆盖a名称,而不是相反,我只需执行rbind(a[!a$Name%在%b$Name,]中),b)。谢谢鉴于OP,这实际上不是正确答案,它不会覆盖匹配项,而是保留原始行。