【问题标题】:Join two data frames in R based on closest timestamp根据最接近的时间戳加入 R 中的两个数据帧
【发布时间】:2015-10-27 09:34:32
【问题描述】:

您好,我有两个表(下面的表 1 和表 2),并希望根据最接近的时间戳将它们连接起来以形成预期输出。如果可能的话,某种涉及 dplyr 的解决方案会很好,但如果它使事情变得更加复杂,那就不行了。

table1 = 
structure(list(date = structure(c(1437051300, 1434773700, 1431457200
), class = c("POSIXct", "POSIXt"), tzone = ""), val1 = c(94L, 
33L, 53L)), .Names = c("date", "val1"), row.names = c(NA, -3L
), class = "data.frame")

table2 = 
structure(list(date = structure(c(1430248288, 1435690482, 1434050843
), class = c("POSIXct", "POSIXt"), tzone = ""), val2 = c(67L, 
90L, 18L)), .Names = c("date", "val2"), row.names = c(NA, -3L
), class = "data.frame")

expected_output = 
structure(list(date = structure(c(1437051300, 1434773700, 1431457200
), class = c("POSIXct", "POSIXt"), tzone = ""), val1 = c(94L,
33L, 53L), val2 = c(90L, 18L, 67L)), .Names = c("date", "val1", 
"val2"), row.names = c(NA, -3L), class = "data.frame")

【问题讨论】:

    标签: r dataframe timestamp dplyr posixct


    【解决方案1】:

    使用data.tableroll = "nearest" 的滚动连接功能:

    require(data.table) # v1.9.6+
    setDT(table1)[, val2 := setDT(table2)[table1, val2, on = "date", roll = "nearest"]]
    

    这里,val2 列是通过使用 roll = "nearest" 选项对列 date 执行 join 来创建的。对于table1$date 的每一行,计算与table2$date 最接近的匹配行,并提取对应行的val2

    【讨论】:

    • 这很有帮助!知道如何从“最近的”更改为“最近的”吗? IE。保持时间方向,以后不合并到一行?
    • @emudrak roll=Inf 定向无限制。 roll=30 对陈旧性的定向限制。使用标志来控制方向。
    【解决方案2】:

    这可能会很慢,但是...

    d   <- function(x,y) abs(x-y) # define the distance function
    idx <- sapply( table1$date, function(x) which.min( d(x,table2$date) )) # find matches
    
    cbind(table1,table2[idx,-1,drop=FALSE])
    #                  date val1 val2
    # 2 2015-07-16 08:55:00   94   90
    # 3 2015-06-20 00:15:00   33   18
    # 1 2015-05-12 15:00:00   53   67
    

    构造idx的另一种方式是max.col(-outer(table1$date, table2$date, d))

    【讨论】:

      猜你喜欢
      • 2020-09-23
      • 2020-12-15
      • 2016-03-23
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多