根据最大x分钟的时间戳在R中加入两个数据帧

时间:2018-04-14 13:37:33

标签: r dataframe

我试图在Date列上的R中加入两个数据帧(不同时间戳的测量值)。两个帧的日期时间戳不相等,所以我需要以某种方式舍入时间戳以便能够加入。 我想到了:

  1. 首先将值舍入到最近的分钟,然后加入 这种方法的问题在于,舍入会导致近似测量值四舍五入到不同的分钟,因此它们无法连接

  2. 根据第二帧中最接近的值加入记录(使用" roll" from" data.table") 这种方法的问题在于每个帧都可能缺少测量值,因此上面的第二个解决方案不会起作用(在丢失的一个之后,最接近的下一个测量是JOIN的错误)。我的问题是如何从两个框架加入两个记录,条件如下: 如果时间戳之间的差异小于2分钟 - 将它们加入1条记录 ELSE(以及一般情况下) - 保留所有与JOINed框架的列中的N / A值不匹配的记录

  3. **由于测量缺失,两个帧的长度可能不同

    温度表

    Name        Date                Value   Unit
    Temperature 01/04/2017 00:02:08 14.6    degC
    Temperature 01/04/2017 00:20:18 15.5    degC
    Temperature 01/04/2017 00:38:29 14      degC
    Temperature 01/04/2017 00:54:45 14.5    degC
    Temperature 01/04/2017 01:14:44 13.9    degC`
    

    湿度表

    Name               Date                   Value   Unit
    Relative Humidity   01/04/2017 00:02:25    56      %
    Relative Humidity   01/04/2017 00:20:34    50      %
    Relative Humidity   01/04/2017 00:38:44    59      %
    Relative Humidity   01/04/2017 01:15:01    58      %`
    

    结果表

    Name.x      Date                Value.x Unit.x name.y         value.y unit.y
    Temperature 01/04/2017 00:02    14.6    degC   Relative Humidity  56      %
    Temperature 01/04/2017 00:20    15.5    degC   Relative Humidity  50      %
    Temperature 01/04/2017 00:38    14      degC   Relative Humidity  59      %
    Temperature 01/04/2017 00:54    14.5    degC   NA                 NA      NA
    Temperature 01/04/2017 01:14    13.9    degC   Relative Humidity  58      %`
    

1 个答案:

答案 0 :(得分:0)

data.table包中的滚动连接可以为您完成此操作。 roll = 120将其设置为120秒的最大差异。 nomatch = NA获取无匹配的缺失值。

library("data.table")
library("anytime")    # just to quickly get your strings as times

d1 = data.table(date = anytime(c("01/04/2017 00:02:08","01/04/2017 00:20:18","01/04/2017 00:38:29","01/04/2017 00:54:45","01/04/2017 01:14:44")),
    value = c(14.6, 15.5, 14  , 14.5, 13.9))
d2 = data.table(date = anytime(c("01/04/2017 00:02:25", "01/04/2017 00:20:34", "01/04/2017 00:38:44", "01/04/2017 01:14:40")),
    value = c(56, 50, 59, 58))

d2[, timestamp_d2 := timestamp]


d = d2[d1, on = 'date', roll = 'nearest', nomatch = NA]

d[abs(timestamp - timestamp_d2) <= 120]