r - 连接两个具有部分公共(public)和不相等列的数据框

标签 r join dplyr merge

是否有更好的方法来利用 R 中合并和连接的强大功能?合并会丢失唯一的行,而联接会创建重复的和部分填充的列。

Dataframe1
Key  Col1  Col2  Col3
A    1     2     3
B    2     4     6

Dataframe2
Key  Col1  Col2  Col4
A    1     2     4
C    3     6     12
D    4     8     20

Merged Dataframe
Key  Col1  Col2  Col3  Col4
A    1     2     3     4
B    2     4     6     <NA> 
C    3     6     <NA>  12
D    4     8     <NA>  20

最佳答案

我们可以使用bind_rows绑定(bind)数据集,然后通过汇总或reframe进行分组以仅返回非NA行

library(dplyr)
bind_rows(df1, df2) %>% 
  group_by(Key) %>%
  reframe(across(everything(), ~ .x[!is.na(.x)][1])) 

-输出

# A tibble: 4 × 5
  Key    Col1  Col2  Col3  Col4
  <chr> <int> <int> <int> <int>
1 A         1     2     3     4
2 B         2     4     6    NA
3 C         3     6    NA    12
4 D         4     8    NA    20

或者可以使用powerjoin

library(powerjoin)
power_full_join(df1, df2, by = "Key", conflict = coalesce_xy) %>% 
    select(Key, order(names(.)[-1])+1)

-输出

   Key Col1 Col2 Col3 Col4
1   A    1    2    3    4
2   B    2    4    6   NA
3   C    3    6   NA   12
4   D    4    8   NA   20

数据

df1 <- structure(list(Key = c("A", "B"), Col1 = 1:2, Col2 = c(2L, 4L
), Col3 = c(3L, 6L)), class = "data.frame", row.names = c(NA, 
-2L))

df2 <- structure(list(Key = c("A", "C", "D"), Col1 = c(1L, 3L, 4L), 
    Col2 = c(2L, 6L, 8L), Col4 = c(4L, 12L, 20L)),
 class = "data.frame", row.names = c(NA, 
-3L))

关于r - 连接两个具有部分公共(public)和不相等列的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75369104/

相关文章:

MySQL删除并加入

Mysql JOIN 获取指定列数据语法错误

r - 分组数据增长率,3组

r - 如果在 2 行中满足某些条件,如何在 R 数据框中添加新列以显示当前行和前一行中值的总和?

php - 从第二个表中提取某些信息但没有 "Where"约束

r - 设置 to.weekly 使用的星期几

r - 将 geom_pointrange 中点和线的大小与 ggplot 分开

r - 从 CSV 解析货币值,转换为百万和十亿的数字后缀

r - tidyr::收集不同类型的多列

r - 用knitr为R代码输入行号