我环顾四周,发现了很多类似的问题,但没有什么可以回答我的问题,所以就这样了。
我想在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循环来做,但我想知道是否有一些快速而优雅的方法来做,因为我的桌子有点大。
答案 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