我正在尝试使用键
df1
.合并两个数据框
df2
和
id
这2个dfs共享很多相同的列名,当
df1$var
中缺少一个值时,例如,df2$var
中不缺少,反之亦然。我希望合并的数据框只有 1 列用于 var
而不是 var.x
和 var.y
.
当两列(例如)
df1$var
和 df2$var
的值都没有丢失时,它们将始终具有相同的值。
另外,我不能绑定行,因为我需要一个多:一个保留所有观察的合并,所以我一直在使用
merge(..., all = T)
或dplyr::full_join
.
其他解决方案(如下所示)适用于两个数据框只有少数几列需要合并的情况。 R join or merge don't duplicate non-joining columns (reproducible)
try
dplyr::rows_patch
,它只更新缺失值:
例子:
library(dplyr)
set.seed(1234)
df <- mtcars[,1:2] %>%mutate(id=row_number())
na_col1 <- sample(c(F,T),nrow(df),replace=T)
na_col2 <- sample(c(F,T),nrow(df),replace=T)
df1 <- df2 <- df
df1[na_col1,1] <- NA
df2[!na_col1,1] <- NA
df1[na_col2,2] <- NA
df2[!na_col2,2] <- NA
out <- rows_patch(df1,df2,by="id")
all.equal(df,out)
[1] TRUE
您可以结合使用
dplyr::rows_patch()
仅更新缺失值,以及 dplyr::rows_insert()
在 df2
中添加 df1
中缺失的行。结果将包括 df1
和 df2
的所有行,如果 NA
或 df1
中存在非缺失值,则填充 df2
s。
使用此示例数据:
library(dplyr)
# missing values and no row for id "F"
(df1 <- data.frame(
id = LETTERS[1:5],
x = c(1, 2, NA, NA, 5),
y = c(NA, 8, 9, NA, 11)
))
# id x y
# 1 A 1 NA
# 2 B 2 8
# 3 C NA 9
# 4 D NA NA
# 5 E 5 11
# missing values and no row for id "E"
(df2 <- data.frame(
id = LETTERS[c(1:4, 6)],
x = c(NA, 2, 3, 4, 6),
y = c(7, NA, NA, 10, 12)
))
# id x y
# 1 A NA 7
# 2 B 2 NA
# 3 C 3 NA
# 4 D 4 10
# 5 F 6 12
你会做:
# rows for all ids "A" - "F", with missing values filled
df1 %>%
rows_patch(df2, by = "id", unmatched = "ignore") %>%
rows_insert(df2, by = "id", conflict = "ignore")
# id x y
# 1 A 1 7
# 2 B 2 8
# 3 C 3 9
# 4 D 4 10
# 5 E 5 11
# 6 F 6 12