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)
中的滚动连接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_NAME并FIRST_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)
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
在data.table语法上,CTDB[ptnamesMID, ...]相当于ptnamesMIDwith的左连接CTDB,即 of 的所有行都ptnamesMID保留在结果集中。