用精确值加上最接近的值进行左连接

时间:2019-02-26 18:45:36

标签: r

我有两个数据集:

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

2 个答案:

答案 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)))