根据最近日期 R 合并数据

KKh*_*sra 2 merge r date left-join

如何根据最近的日期 jft.join 2 个数据框?我目前编写了脚本,以便它按确切的日期加入,但我更愿意按最近的日期进行连接,以防不完全匹配。

这就是我目前所拥有的:

MASTER_DATABASE <- left_join(ptnamesMID, CTDB, by = c("LAST_NAME", "FIRST_NAME", "Measure_date" = "VISIT_DATE"))
Run Code Online (Sandbox Code Playgroud)

Uwe*_*Uwe 6

中的滚动连接data.table有一个参数roll = "nearest",它可能符合OP的期望。

不幸的是,OP 未能提供示例数据,因此我不得不自己编写示例数据。

创建样本数据集

set.seed(123L)
dates <- seq(as.Date("2017-01-01"), as.Date("2017-12-31"), by = "1 day")
ptnamesMID <- data.frame(ID = 1:10, Measure_date = sample(dates, 10L))
CTDB <- data.frame(ID = sample.int(10, 30L, TRUE), VISIT_DATE = sample(dates, 30L, TRUE))
Run Code Online (Sandbox Code Playgroud)

在这里,ID使用 来代替LAST_NAMEFIRST_NAME进行简化。ptnamesMID由 10 行组成,同时CTDB有 30 行随机抽样的访问日期。

滚动连接

library(data.table)
# coerce to data.table and append join columns to preserve the original columns 
setDT(CTDB)[, join_date := VISIT_DATE]
setDT(ptnamesMID)[, join_date := Measure_date]
# rolling join
CTDB[ptnamesMID, on = .(ID, join_date), roll = "nearest"]
Run Code Online (Sandbox Code Playgroud)
    ID VISIT_DATE  join_date Measure_date
 1:  1 2017-06-20 2017-04-15   2017-04-15
 2:  2 2017-05-17 2017-10-14   2017-10-14
 3:  3 2017-06-10 2017-05-29   2017-05-29
 4:  4 2017-10-17 2017-11-16   2017-11-16
 5:  5 2017-06-13 2017-12-06   2017-12-06
 6:  6 2017-02-16 2017-01-17   2017-01-17
 7:  7 2017-07-24 2017-07-09   2017-07-09
 8:  8 2017-10-23 2017-12-28   2017-12-28
 9:  9 2017-02-20 2017-07-16   2017-07-16
10: 10 2017-08-31 2017-06-12   2017-06-12
Run Code Online (Sandbox Code Playgroud)

data.table语法上,CTDB[ptnamesMID, ...]相当于ptnamesMIDwith的左连接CTDB,即 of 的所有行都ptnamesMID保留在结果集中。