【问题标题】:Merging two dataframes into one (1:n) [duplicate]将两个数据帧合并为一个(1:n)[重复]
【发布时间】:2019-08-13 15:17:43
【问题描述】:

我有两个数据框 df1df2。这两个数据帧之间存在 1:n 关系,df2df1 中的每个条目都有多个条目。

我的目标是合并这两个数据框,以便重复 df1 中的所有行并导入 df2 中的所有列。 df2中的外键(FK)指的是df1中的主键(PK)

# example data:
df1 <- data.frame(PK = c(1,2,3,4,5),
                  varA = sample(5, replace=T),
                  varB = sample(5, replace=T))

df2 <- data.frame(FK = c(1,1,2,2,3,3,4,4,4),
                  varC = seq(9),
                  varD = seq(9))

数据框应该是这样的:

PK | FK | varA | varB | varC | varD
1    1    ...    ...    1      1
1    1    ...    ...    2      2
2    2    ...    ...    3      3
2    2    ...    ...    4      4
3    3    ...    ...    5      5
3    3    ...    ...    6      6
4    4    ...    ...    7      7
4    4    ...    ...    8      8
4    4    ...    ...    9      9
5    NA   ...    ...    NA     NA

df1 中的所有条目都应该存在,即使 df2 中没有相应的条目(此时 varC 和 varD 应该是 NA)

【问题讨论】:

  • dplyr 包:df1 %&gt;% left_join(df2, by = c("PK", "FK")) 也许?
  • 你需要merge(df1, df2)吗?
  • 另外,您想要的输出不匹配。 varCvarD 是示例数据中 1:9 的序列。另外,当您使用sample时,请附上set.seed,以便我们复制您的数据
  • @DimitriPetrenko : 错误:by 不能包含 LHS 中缺少的连接列 FK
  • 抱歉,df1 %&gt;% left_join(df2, by = c("PK" = "FK"))left_join(df1, df2, by = c("PK" = "FK"))

标签: r merge dplyr tidyverse


【解决方案1】:

您可以使用原生 R 函数 merge() https://www.statmethods.net/management/merging.html

或使用 dplyr,由于更直观的类似 sql 的语法,我个人更喜欢它: https://dplyr.tidyverse.org/reference/join.html?q=inner%20_%20j#join-types

由于您指的是“PK”和“FK”,您可能更喜欢第二个选项,但需要先使用命令安装和加载 dplyr 包

install.packages("dplyr")
library(dplyr)

【讨论】:

  • merge() 类似于 SQL UNIONdplyr::left_join() 类似于 SQL LEFT JOIN。它们的用途不同。
猜你喜欢
  • 2018-02-27
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2021-05-19
  • 2021-06-22
  • 2017-03-22
相关资源
最近更新 更多