【问题标题】:Merging / Joining Data While Keeping All Data from Both Data Frames (even if no matches)合并/合并数据,同时保留两个数据帧中的所有数据(即使没有匹配项)
【发布时间】:2021-01-15 14:40:35
【问题描述】:

我有两个数据框,我试图通过 ID 和日期将它们组合成一个主数据框。我的问题是数据框有一些相似和一些独特的日期。一个数据框按顺序遍历日期,但可能在开始和/或结束时缺少一两天,而另一个数据框具有来自同一 ID 的多个样本,并且仅每 3 天采样一次。

DF1 示例:

Nest.ID     Date        X       Y       Nest.ID.Date
AMRO_1_     5/2/20      7       2       AMRO_1_5-02-20
AMRO_1_     5/3/20      1       5       AMRO_1_5-03-20
AMRO_1_     5/4/20      7       9       AMRO_1_5-04-20
AMRO_1_     5/5/20      3       2       AMRO_1_5-05-20
AMRO_1_     5/6/20      1       3       AMRO_1_5-06-20

DF2 示例

Nest.ID     Indiv.ID    Date        U       V       Nest.ID.Date
AMRO_1_     A           5/1/20      468     294     AMRO_1_5-01-20
AMRO_1_     B           5/1/20      454     456     AMRO_1_5-01-20
AMRO_1_     C           5/1/20      436     245     AMRO_1_5-01-20
AMRO_1_     A           5/4/20      356     762     AMRO_1_5-04-20
AMRO_1_     B           5/4/20      345     953     AMRO_1_5-04-20
AMRO_1_     C           5/4/20      356     345     AMRO_1_5-04-20
AMRO_1_     A           5/7/20      763     193     AMRO_1_5-07-20
AMRO_1_     B           5/7/20      763     186     AMRO_1_5-07-20
AMRO_1_     C           5/7/20      235     762     AMRO_1_5-07-20

想要的结果:

Nest.ID     Date        X       Y       Indiv.ID    U       V
AMRO_1_     5/1/20      NA      NA      A           468     294
AMRO_1_     5/1/20      NA      NA      B           454     456
AMRO_1_     5/1/20      NA      NA      C           436     245
AMRO_1_     5/2/20      7       2       NA          NA      NA
AMRO_1_     5/3/20      1       5       NA          NA      NA
AMRO_1_     5/4/20      7       9       A           356     762
AMRO_1_     5/4/20      7       9       B           345     953
AMRO_1_     5/4/20      7       9       C           356     345
AMRO_1_     5/5/20      3       2       NA          NA      NA
AMRO_1_     5/6/20      1       3       NA          NA      NA
AMRO_1_     5/7/20      NA      NA      A           763     193
AMRO_1_     5/7/20      NA      NA      B           763     186
AMRO_1_     5/7/20      NA      NA      C           235     762

使用full_joinkeep= TRUE 我可以非常接近并获得最终的DF,其中包含来自DF1 的所有数据以及未对DF2 进行采样的NA,但我无法弄清楚如何还包括开头/不在 DF1 中但在 DF2 中的结束日期(示例中为 5/1 和 5/7)。我怀疑这可能是由于我的 ID.Date 的“关键”,但这些是我可以用来在合并时保持事情井井有条的唯一变量(换句话说,因为我每个 ID 有多个样本,我不能只是使用 ID 作为我的“密钥”)。

【问题讨论】:

  • 查看您尝试调试的代码的实际 sn-p 会很有帮助。如果您使用的是dplyr::full_join,则没有all 参数,但它确实有keep 参数
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表格的代码的 R/SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • @camille 是的,我就是这个意思。我一直在 merge() 和 join() 之间切换,并在脑海中切换了两者。无论如何,keep = 也没有完成这项工作,我在最终合并的 DF 中仍然缺少 DF2 的那些开始和结束日期
  • 联接不在键上,它们在条件上。查询不需要知道键和其他约束;输入和输出表的含义是查询的必要和充分的。 在给出业务关系(船舶)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。 Is there any rule of thumb to construct SQL query from a human-readable description? Re relational querying.您现在没有明确说明返回了哪些行。
  • 您似乎只想要在 Nest.ID.Date 值的相等性和 Nest.ID 值的相等性上的完全连接的投影,即在 Date 值的相等性和 Nest.ID 值的相等性上。您说您尝试过并且在对已删除答案的评论中没有得到您想要的,但是您所说的并不是您所说的完全加入的结果,而您的示例输出是。 minimal reproducible example

标签: r join dplyr merge


【解决方案1】:

你想从dplyr 做一个full_join()

以下是更友好形式的数据:

DF1 <- structure(list(Nest.ID = c("AMRO_1_", "AMRO_1_", "AMRO_1_", "AMRO_1_", 
"AMRO_1_"), Date = c("5/2/20", "5/3/20", "5/4/20", "5/5/20", 
"5/6/20"), X = c(7, 1, 7, 3, 1), Y = c(2, 5, 9, 2, 3), Nest.ID.Date = c("AMRO_1_5-02-20", 
"AMRO_1_5-03-20", "AMRO_1_5-04-20", "AMRO_1_5-05-20", "AMRO_1_5-06-20"
)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-5L), spec = structure(list(cols = list(Nest.ID = structure(list(), class = c("collector_character", 
"collector")), Date = structure(list(), class = c("collector_character", 
"collector")), X = structure(list(), class = c("collector_double", 
"collector")), Y = structure(list(), class = c("collector_double", 
"collector")), Nest.ID.Date = structure(list(), class = c("collector_character", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1), class = "col_spec"))

DF2 <- structure(list(Nest.ID = c("AMRO_1_", "AMRO_1_", "AMRO_1_", "AMRO_1_", 
"AMRO_1_", "AMRO_1_", "AMRO_1_", "AMRO_1_", "AMRO_1_"), Indiv.ID = c("A", 
"B", "C", "A", "B", "C", "A", "B", "C"), Date = c("5/1/20", "5/1/20", 
"5/1/20", "5/4/20", "5/4/20", "5/4/20", "5/7/20", "5/7/20", "5/7/20"
), U = c(468, 454, 436, 356, 345, 356, 763, 763, 235), V = c(294, 
456, 245, 762, 953, 345, 193, 186, 762), Nest.ID.Date = c("AMRO_1_5-01-20", 
"AMRO_1_5-01-20", "AMRO_1_5-01-20", "AMRO_1_5-04-20", "AMRO_1_5-04-20", 
"AMRO_1_5-04-20", "AMRO_1_5-07-20", "AMRO_1_5-07-20", "AMRO_1_5-07-20"
)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-9L), spec = structure(list(cols = list(Nest.ID = structure(list(), class = c("collector_character", 
"collector")), Indiv.ID = structure(list(), class = c("collector_character", 
"collector")), Date = structure(list(), class = c("collector_character", 
"collector")), U = structure(list(), class = c("collector_double", 
"collector")), V = structure(list(), class = c("collector_double", 
"collector")), Nest.ID.Date = structure(list(), class = c("collector_character", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1), class = "col_spec"))

这里是代码。

library(dplyr)
library(lubridate)

DF1 %>% full_join(DF2) %>%
  select(-Nest.ID.Date) %>%
  mutate(Date = mdy(Date)) %>%
  arrange(Date)  

Joining, by = c("Nest.ID", "Date", "Nest.ID.Date")
# A tibble: 13 x 7
   Nest.ID Date           X     Y Indiv.ID     U     V
   <chr>   <date>     <dbl> <dbl> <chr>    <dbl> <dbl>
 1 AMRO_1_ 2020-05-01    NA    NA A          468   294
 2 AMRO_1_ 2020-05-01    NA    NA B          454   456
 3 AMRO_1_ 2020-05-01    NA    NA C          436   245
 4 AMRO_1_ 2020-05-02     7     2 NA          NA    NA
 5 AMRO_1_ 2020-05-03     1     5 NA          NA    NA
 6 AMRO_1_ 2020-05-04     7     9 A          356   762
 7 AMRO_1_ 2020-05-04     7     9 B          345   953
 8 AMRO_1_ 2020-05-04     7     9 C          356   345
 9 AMRO_1_ 2020-05-05     3     2 NA          NA    NA
10 AMRO_1_ 2020-05-06     1     3 NA          NA    NA
11 AMRO_1_ 2020-05-07    NA    NA A          763   193
12 AMRO_1_ 2020-05-07    NA    NA B          763   186
13 AMRO_1_ 2020-05-07    NA    NA C          235   762

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多