r - 根据最近的日期合并数据 R

我如何根据最近的日期 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_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"]
    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/

相关文章:

mongodb - 使用 Mongoose 和 SRV 连接字符串将数据插入 MongoDB Atl

reactjs - 从 REST API 加载的 react native 图像 URL 未显示

firebase - Cloud Functions for Firebase 是否遵守实时数据库规

scala - 扁平化 future 内部 yield

spring - Feign Client - 动态授权 header

css - Flex 布局 - "flex-basis: 1e-09px"是什么意思?

php - 创建一个函数来注销 WordPress 用户?

git - 使用通配符过滤 git 分支

apache-kafka - 一对多KStream-KTable连接

vuejs2 - 在 vue.js 中捕获 API 请求中的错误