加入两个数据帧并覆盖匹配行 [R]

Join two dataframes and overwrite matching rows [R]

我环顾四周,发现了很多类似的问题,但没有一个能回答我的问题,所以就这样吧。

我想按列连接 R 中的两个数据帧(就像在 rbind 中一样)并让第二个 table 覆盖第一列的匹配值,这样第一列就没有重复的值

我想做这样的事情:

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

我确定我可以用一堆乱七八糟的 for 循环来完成它,但我想知道是否有一些快速而优雅的方法来完成它,因为我的 table 有点大。

我只是使用 %in% 来测试 b 中不存在于 a 中的 Name,然后仅 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