我试图在Date列上的R中加入两个数据帧(不同时间戳的测量值)。两个帧的日期时间戳不相等,所以我需要以某种方式舍入时间戳以便能够加入。 我想到了:
首先将值舍入到最近的分钟,然后加入 这种方法的问题在于,舍入会导致近似测量值四舍五入到不同的分钟,因此它们无法连接
根据第二帧中最接近的值加入记录(使用" roll" from" data.table") 这种方法的问题在于每个帧都可能缺少测量值,因此上面的第二个解决方案不会起作用(在丢失的一个之后,最接近的下一个测量是JOIN的错误)。我的问题是如何从两个框架加入两个记录,条件如下: 如果时间戳之间的差异小于2分钟 - 将它们加入1条记录 ELSE(以及一般情况下) - 保留所有与JOINed框架的列中的N / A值不匹配的记录
**由于测量缺失,两个帧的长度可能不同
温度表
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 %`
答案 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]