如果表 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
,您可以尝试以下操作。加入后,您会希望列 a
和 c
相等,并保持 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 函数连接两个表的主要内容,如果未能解决你的问题,请参考以下文章
如果日期介于第二个数据帧中的两个日期之间,则 r 标记第一个数据帧中的行
在包含多个开始和日期列表的表中查找日期,如果找到则返回默认值