【问题标题】:Doing a left join with exact values plus closest values使用精确值加上最接近的值进行左连接
【发布时间】:2019-02-26 18:45:35
【问题描述】:

我有两个数据集:

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,“2012-09-23”将匹配 id2 1001 的“2012-09-24”,因为它是 id2 的唯一日期,而对于 1003,“2014-11-08”将匹配“2014-11” -09" of 1003 for id2,因为它是最近的一天。

想要的结果:

  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

【问题讨论】:

标签: r


【解决方案1】:

我还建议您遵循非 equi data.table 连接,但如果您出于某种原因想坚持使用 dplyr 并且您的数据不是很大或者您有足够的内存,你也可以试试:

library(dplyr)

table1 %>%
  left_join(table2, by = c("id" = "id2")) %>%
  group_by(id) %>%
  slice(which.min(abs(date - date2)))

输出:

# A tibble: 4 x 3
# Groups:   id [4]
     id date                date2              
  <dbl> <dttm>              <dttm>             
1  1000 2012-05-13 00:00:00 2012-05-13 00:00:00
2  1001 2012-09-23 00:00:00 2012-09-24 00:00:00
3  1002 2011-04-09 00:00:00 2011-04-15 00:00:00
4  1003 2014-11-08 00:00:00 2014-11-09 00:00:00

【讨论】:

    【解决方案2】:

    使用 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
    

    【讨论】:

    • 很好的答案,但我将如何解释 ID 字段?因为连接是基于匹配的 ID 和日期
    猜你喜欢
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2015-11-29
    • 2018-03-31
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多