【问题标题】:JOIN two data frames in R based on timestamps that are maximum x minutes apart根据最大 x 分钟间隔的时间戳加入 R 中的两个数据帧
【发布时间】:2018-04-14 13:37:33
【问题描述】:

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

  1. 首先将值四舍五入到最接近的分钟,然后加入 这种方法的问题是四舍五入会导致近距离测量被四舍五入到不同的分钟,所以它们不能被加入

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

** 由于缺少测量值,两个帧的长度可能不同

温度表

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      %`

【问题讨论】:

  • 您的Date 列中的class 是什么?您目前如何四舍五入这些值?
  • 日期列是POSIXct type,目前使用的舍入函数是-round_date {lubridate}

标签: r dataframe


【解决方案1】:

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]

【讨论】:

  • 这仅在假设 d2 测量总是在 d1 测量后几秒钟进行时才有效。我不能假设。 d2 测量可以在 d1 测量之前几秒或之后几秒进行
  • 这可以通过设置 `roll = 'nearest' 加入最近的观察然后对两个时间戳之间的绝对差是否小于 120 进行子集化来完成。我将编辑答案需要几步。
  • 在当前的解决方案中,结果表中不会有 NA 值,并且会丢失一些观察结果
猜你喜欢
  • 2015-10-27
  • 2020-09-23
  • 2021-03-13
  • 2018-10-06
  • 1970-01-01
  • 2019-01-13
  • 2020-12-15
  • 2017-05-09
  • 2019-08-12
相关资源
最近更新 更多