如果表 1 中的日期早于表 2 中的日期,则 R 函数连接两个表

Posted

技术标签:

【中文标题】如果表 1 中的日期早于表 2 中的日期,则 R 函数连接两个表【英文标题】:R function to join two tables if date in table 1 is earlier than date in table 2 【发布时间】:2021-08-03 02:02:57 【问题描述】:

这个问题是关于 R 的 tidyverse 包中的 Tibbles。我创建了以下示例来表示我的数据。

Tibble 'ab' 是人员列表(a 列)和特定事件发生的日期(b 列),例如接种了疫苗。 Tibble 'cd' 是同一个人的列表(c 列),但包括为该人记录的所有事件日期(d 列)。

我想要一个类似于 Tibble 'cd' 的表格,但只有日期(d 列)早于 Tibble 'ab'(b 列)中每个人的日期(例如接受疫苗的日期)。换句话说,对于每个人,排除在 Tibble 'ab' 中的疫苗日期之后发生的所有事件。

a <- 1001:1007
b <- c ("20/03/1998", "04/05/2012", "06/07/1989", "14/08/1990", "30/01/1978", "09/09/2011","23/11/2005")

ab <- tibble (a,b) 
ab_date <- ab %>% mutate (b = as.Date (b, format = "%d/%m/%Y")) 

c <- c( 1001, 1001, 1001, 1001, 1002, 1002, 1002)
d <- c( "12/02/1996", "14/05/1997", "20/03/1998", "23/03/1998", "10/10/1992", "04/05/2012", "13/11/2020")

cd <- tibble (c,d)
cd_date <- cd  %>% mutate (d = as.Date (d, format = "%d/%m/%Y"))

对于这个例子,它看起来像这样:

e <- c(1001, 1001, 1002)
f <- c( "12/02/1996","14/05/1997", "10/10/1992") 

ef <- tibble (e,f)
ef_date <- ef %>% mutate (f = as.Date (f, format = "%d/%m/%Y"))

我已经尝试了一些关于 inner_join 和 blur_join 的事情,但我不确定如何将这些应用到我想要做的事情!

任何帮助将不胜感激!

谢谢

卢克

【问题讨论】:

【参考方案1】:

使用fuzzyjoin,您可以尝试以下操作。加入后,您会希望列 ac 相等,并保持 b 出现在 d 之后的日期。使用内连接,您只会在两个数据框中保持匹配的行。

library(tidyverse)
library(fuzzyjoin)

ab_date %>%
  fuzzy_inner_join(cd_date,
                   by = c("a" = "c", "b" = "d"),
                   match_fun = c(`==`, `>`)) %>%
  select(c, d)

输出

      c d         
  <dbl> <date>    
1  1001 1996-02-12
2  1001 1997-05-14
3  1002 1992-10-10

【讨论】:

谢谢!完美运行 太棒了 - 很高兴听到!如果合适,请随时accept answer。

以上是关于如果表 1 中的日期早于表 2 中的日期,则 R 函数连接两个表的主要内容,如果未能解决你的问题,请参考以下文章

查找表 B 中相对于表 A 日期的最新值

如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行

在包含多个开始和日期列表的表中查找日期,如果找到则返回默认值

如果表中的日期时间列在特定时间段内,则根据记录计数

Oracle 触发器检查一个表中的课程持续时间,如果课程是特定日期,则阻止更新

如果日期早于当前月份,则将日期转换为当前月份的第一天