我有两个数据帧需要合并到单个匹配的列上,第二个表需要替换第一个匹配列的表中的所有值。
我尝试了以下代码的几种变体,但没有返回与原始大小相同的数据框。
merge.data.frame(x, y, by.x = "Name", by.y = "Name")
merge.data.frame(x, y, by.x = "SN", all.x = FALSE,y all.y = TRUE)
用于此的变量如下所示
x <- data.frame("SN" = 1:4, "Age" = c(21,15,44,55), "Name" = c("John","Dora", NA, NA))
y <- data.frame("SN" = 4, "Age" = c(100), "Name" = c("B"))
SN Age Name # x dataframe
1 1 21 John
2 2 15 Dora
3 3 44 NA
4 4 55 NA
SN Age Name # y dataframe
5 4 100 B
数据框的最终结果应如下所示:
加入“ SN”并覆盖“年龄”和“名称”列中的值,以x中的内容替换为y中的内容。
SN Age Name # result
1 1 21 John
2 2 15 Dora
3 3 44 NA
4 4 100 B
编辑:如果您在下面的数据框中显示的其他列不在y中
SN Gender Age Name # z table with additional column
1 1 M 21 John
2 2 F 15 Dora
3 3 M 44 NA
4 4 M 55 NA
从plyr软件包中运行以下代码将删除不必要的列
library(plyr)
rbind.fill(z[!z$SN %in% y$SN,], y[,])
SN Gender Age Name # result if additional columns are present in z and not in y
1 1 M 21 John
2 2 F 15 Dora
3 3 M 44 NA
4 4 M 100 B
答案 0 :(得分:4)
您可以删除SN
中与x
中的SN
值匹配的y
值,然后将两个数据帧行绑定。
rbind(x[!x$SN %in% y$SN,], y)
SN Age Name
1 1 21 John
2 2 15 Dora
3 3 44 <NA>
4 4 100 B
答案 1 :(得分:2)
我觉得更容易理解的一个更长的解决方案是,首先过滤x中以y开头的行,然后将y添加到x中。
# Added stringsAsFactors as False in df's.
x <- data.frame("SN" = 1:4, "Age" = c(21,15,44,55), "Name" = c("John","Dora", NA, NA), stringsAsFactors = F)
y <- data.frame("SN" = 4, "Age" = c(100), "Name" = c("B"), stringsAsFactors = F)
# Joins
x %>%
anti_join(y, by = c("SN")) %>% # Remove row from x that are in y
bind_rows(y) # Add rows from y to x