我如何根据最近的日期 jeft.join 2 个数据框?我目前已经编写了脚本,以便它在确切的日期之前加入,但我更愿意在最近的日期之前加入,以防没有完全匹配的情况。
这是我目前拥有的:
MASTER_DATABASE <- left_join(ptnamesMID, CTDB, by = c("LAST_NAME", "FIRST_NAME", "Measure_date" = "VISIT_DATE"))
最佳答案
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))
此处,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"]
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, ...]
等同于 ptnamesMID
与 的左连接CTDB
,即ptnamesMID
的所有行都保留在结果集中。
https://stackoverflow.com/questions/49156597/