加入两个数据帧并覆盖匹配行 [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
我环顾四周,发现了很多类似的问题,但没有一个能回答我的问题,所以就这样吧。
我想按列连接 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