我想将两个表联接在一起,其中联接基于日期字段中属于特定(起始日期,结束日期)范围的日期。在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 = ???)
但匹配项不是“日期=查找日期”,而是“日期在范围内(开始日期,结束日期)
换句话说。我想看的是:
谢谢。
答案 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