如何合并两个数据帧,并根据第一个df中的存在替换/创建行?

时间:2018-11-14 18:54:48

标签: r

我有两个数据帧df1和df2,我正在寻找获得df3的最简单操作。

如果df1匹配(所以df2不是解决方案),我想用id中的行来用rbind.fill中的行替换,并且从df2附加行,其中iddf1中不存在,而仅对df2中存在的列进行添加。

我想我可以使用多个联接和反联接,然后合并,但是我想知道是否已经存在该操作的函数。

df1 <- data.frame(id = 1:5, c1 = 11:15, c2 = 16:20, c3 = 21:25)
df2 <- data.frame(id = 4:7, c1 = 1:4, c2 = 5:8)

df1
  id c1 c2 c3
  1 11 16 21
  2 12 17 22
  3 13 18 23
  4 14 19 24
  5 15 20 25

df2
  id c1 c2
  4  1  5
  5  2  6
  6  3  7
  7  4  8

df3
  id c1 c2 c3
  1  11 16 21
  2  12 17 22
  3  13 18 23
  4  1  5  24
  5  2  6  25
  6  3  7  NULL
  7  4  8  NULL

2 个答案:

答案 0 :(得分:0)

我最终得到了:

special_combine <- function(df1, df2){
  df1_int <- df1[, colnames(df1) %in% colnames(df2)]
  df1_ext <- df1[, c("id", colnames(df1)[!colnames(df1) %in% colnames(df2)])]
  df3 <- bind_rows(df1_int, df2)
  df3 <- df3[!duplicated(df3$id, fromLast=TRUE), ] %>% 
    dplyr::left_join(df1_ext, by="id") %>% 
    dplyr::arrange(id)
  df3
}

答案 1 :(得分:0)

您可以使用我的软件包safejoin,进行完全联接,并使用dplyr::coalesce处理冲突:

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
library(dplyr)
df1 <- data.frame(id = 1:5, c1 = 11:15, c2 = 16:20, c3 = 21:25)
df2 <- data.frame(id = 4:7, c1 = 1:4, c2 = 5:8)
safe_full_join(df1, df2, by= "id", conflict = coalesce)
#   id c1 c2 c3
# 1  1 11 16 21
# 2  2 12 17 22
# 3  3 13 18 23
# 4  4 14 19 24
# 5  5 15 20 25
# 6  6  3  7 NA
# 7  7  4  8 NA