我有两个数据帧df1和df2,我正在寻找获得df3的最简单操作。
如果df1
匹配(所以df2
不是解决方案),我想用id
中的行来用rbind.fill
中的行替换,并且从df2
附加行,其中id
在df1
中不存在,而仅对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
答案 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