表联接与日期范围检查

时间:2019-11-13 13:21:24

标签: r dplyr

我想将两个表联接在一起,其中联接基于日期字段中属于特定(起始日期,结束日期)范围的日期。在R中有一种很好的优雅方法(通过dplyr或其他方式)。

例如,如果我有:

x <- data.frame(
       Ref = c(1:5),
       Event_Date = as.Date(c("2014-03-31", "2013-12-01", "2016-07-13", "2017-04-13", "2015-02-01"))
)

y <- data.frame(
       Period_ID = c(2013:2016),
       Period_Start = as.Date(c("2013-01-01", "2014-01-01", "2015-01-01", "2016-01-01")),
       Period_End = as.Date(c("2013-12-31", "2014-12-31", "2015-12-31", "2016-12-31"))
)

然后我要进行左联接,例如:

z = left_join(x, y, by = ???)

但匹配项不是“日期=查找日期”,而是“日期在范围内(开始日期,结束日期)

换句话说。我想看的是:

enter image description here

谢谢。

2 个答案:

答案 0 :(得分:3)

这看起来像sqldf的工作,它使您可以在SQL中制定联接。 (SQL具有直接表达您的加入条件的语言手段。)

library(sqldf)
z <- sqldf("SELECT * FROM x
            LEFT JOIN y
            ON  x.Event_Date BETWEEN y.Period_Start AND y.Period_End") %>%
  select( Ref, Event_Date, Period_ID )
z

输出:

  Ref Event_Date Period_ID
1   1 2014-03-31      2014
2   2 2013-12-01      2013
3   3 2016-07-13      2016
4   4 2017-04-13        NA
5   5 2015-02-01      2015

答案 1 :(得分:3)

使用data.table,您可以通过更新联接将新列添加到x

library(data.table)
setDT(x)
setDT(y)

x[y, on = .(Event_Date >= Period_Start, Event_Date <= Period_End),
  Period_ID := i.Period_ID]

x
#    Ref Event_Date Period_ID
# 1:   1 2014-03-31      2014
# 2:   2 2013-12-01      2013
# 3:   3 2016-07-13      2016
# 4:   4 2017-04-13        NA
# 5:   5 2015-02-01      2015