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

时间:2015-02-02 16:43:01

标签: 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, 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循环来做,但我想知道是否有一些快速而优雅的方法来做,因为我的桌子有点大。

2 个答案:

答案 0 :(得分:2)

我只是使用%in%来测试b中不存在的Name,然后仅rbind()这些行转到a。< / p>

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

答案 1 :(得分:0)

我玩游戏有点晚了,但鉴于 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