如何在 R 中合并或连接数据框并合并所有具有缺失值的列?

问题描述 投票:0回答:2

我正在尝试使用键

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)

r dplyr merge
2个回答
1
投票

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

0
投票

您可以结合使用

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
© www.soinside.com 2019 - 2024. All rights reserved.