我有两个数据集:
table1 <- data.frame(id=c(1000,1001,1002,1003),
date=as.POSIXct(c("2012-05-13","2012-09-23","2011-04-09","2014-11-08")))
table2 <- data.frame(id2=c(1000,1000,1001,1002,1003,1003),
date2=as.POSIXct(c("2012-05-13","2012-05-16","2012-09-24","2011-04-15","2014-11-09", "2014-11-10")))
我想根据匹配的ID和日期在table1上进行左联接,但是并不是所有的日期都完全匹配,所以我想知道如何才能根据最近的日期联接日期?例如,对于ID 1001,ID2012 100会与“ 2012-09-24”匹配,因为ID2是ID2的唯一日期;对于1003,ID 20141的“ 2014-11-08”将与“ 2014-11”匹配id2是1003的-09“,因为它是最近的一天。
所需结果:
id date date2
1 1000 2012-05-13 2012-05-13
2 1001 2012-09-23 2012-09-24
3 1002 2011-04-09 2011-04-15
4 1003 2014-11-08 2014-11-09
答案 0 :(得分:0)
使用data.table执行滚动连接到最接近的值。 DT1是通过引用更新的,因此即使在大数据或大数据上也应非常快
library(data.table)
样本数据
dt1 <- as.data.table(table1)
dt2 <- as.data.table(table2)
代码
dt1[, date2 := dt2[dt1, date2, on = c("id2 == id", "date2 == date"), roll = "nearest"]][]
输出
# id date date2
# 1: 1000 2012-05-13 2012-05-13
# 2: 1001 2012-09-23 2012-09-23
# 3: 1002 2011-04-09 2011-04-09
# 4: 1003 2014-11-08 2014-11-08
答案 1 :(得分:0)
我还建议您遵循非等式CreateDocumentQuery
的联接,但是如果出于任何原因您想坚持使用data.table
并且数据不是很大或者有足够的内存,您也可以尝试:
dplyr
输出:
library(dplyr)
table1 %>%
left_join(table2, by = c("id" = "id2")) %>%
group_by(id) %>%
slice(which.min(abs(date - date2)))