将表1中的数据帧和覆盖值与表2中的所有值合并

时间:2019-06-15 23:39:18

标签: r dataframe dplyr

我有两个数据帧需要合并到单个匹配的列上,第二个表需要替换第一个匹配列的表中的所有值。

我尝试了以下代码的几种变体,但没有返回与原始大小相同的数据框。

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

2 个答案:

答案 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