如何执行按ID分组的最近时间戳的rolljoin?
我有两个数据表,如下所示 DT1 库(数据表) 图书馆(lubridate) 但这给了我们类似的东西如何执行按ID分组的最近时间戳的rolljoin?,r,dplyr,data.table,R,Dplyr,Data.table,我有两个数据表,如下所示 DT1 库(数据表) 图书馆(lubridate) 但这给了我们类似的东西 id start_time cube res_cube 1: 7 2017-11-01 08:35:30 NA 309 2: 7 2017-11-01 09:07:48 NA 625 3:
id start_time cube res_cube
1: 7 2017-11-01 08:35:30 NA 309
2: 7 2017-11-01 09:07:48 NA 625
3: 7 2017-11-01 09:46:32 NA 469
4: 3 2017-11-01 10:31:29 NA 712
5: 3 2017-11-01 10:57:25 NA 375
6: 3 2017-11-01 13:22:10 NA 630
我没有获得res\u time
,我认为我在滚动连接中做错了什么
我还注意到,我在连接结果的开始时间列中得到了resu时间
非常感谢您的帮助。我通过向前滚动获得了结果 而不是向后滚动
setDT(DT1)
setDT(DT2)
DT1 = DT1[,start_time := parse_date_time2(start_time,orders="YmdHMS",tz="NA")]
DT2 = DT2[,res_time := parse_date_time2(res_time,orders="YmdHMS",tz="NA")]
DT1 [,time:=start_time]
DT2[,time:=res_time]
setkey(DT1 ,id,time)
setkey(DT2,id,time)
ans = DT2[DT1, roll=T]# perform a Rolling Forward where Each start_time in DT1 is matched to the closest res_time in DT2.
ans
id res_time cube time start_time i.cube
1: 3 2017-11-01 10:31:29 712 2017-11-01 10:32:29 2017-11-01 10:32:29 711
2: 3 2017-11-01 10:57:25 375 2017-11-01 10:59:25 2017-11-01 10:59:25 376
3: 3 2017-11-01 13:22:10 630 2017-11-01 13:24:12 2017-11-01 13:24:12 628
4: 7 2017-11-01 08:35:30 309 2017-11-01 08:37:35 2017-11-01 08:37:35 628
5: 7 2017-11-01 08:35:30 309 2017-11-01 09:07:44 2017-11-01 09:07:44 625
6: 7 2017-11-01 09:07:48 625 2017-11-01 09:46:16 2017-11-01 09:46:16 469
希望有帮助您能提供DT1和DT2的可复制版本吗?这将使回答者无需独立进行一系列格式化和转换以获得测试。@LateMail确保我会尽快更新。@LateMail抱歉忘记更改列名。已更新请编辑您的回答并显示
ans
的内容。这将有助于未来的读者验证你的答案确实满足OP的要求。非常感谢。
id start_time cube res_cube
1: 7 2017-11-01 08:35:30 NA 309
2: 7 2017-11-01 09:07:48 NA 625
3: 7 2017-11-01 09:46:32 NA 469
4: 3 2017-11-01 10:31:29 NA 712
5: 3 2017-11-01 10:57:25 NA 375
6: 3 2017-11-01 13:22:10 NA 630
setDT(DT1)
setDT(DT2)
DT1 = DT1[,start_time := parse_date_time2(start_time,orders="YmdHMS",tz="NA")]
DT2 = DT2[,res_time := parse_date_time2(res_time,orders="YmdHMS",tz="NA")]
DT1 [,time:=start_time]
DT2[,time:=res_time]
setkey(DT1 ,id,time)
setkey(DT2,id,time)
ans = DT2[DT1, roll=T]# perform a Rolling Forward where Each start_time in DT1 is matched to the closest res_time in DT2.
id res_time cube time start_time i.cube
1: 3 2017-11-01 10:31:29 712 2017-11-01 10:32:29 2017-11-01 10:32:29 711
2: 3 2017-11-01 10:57:25 375 2017-11-01 10:59:25 2017-11-01 10:59:25 376
3: 3 2017-11-01 13:22:10 630 2017-11-01 13:24:12 2017-11-01 13:24:12 628
4: 7 2017-11-01 08:35:30 309 2017-11-01 08:37:35 2017-11-01 08:37:35 628
5: 7 2017-11-01 08:35:30 309 2017-11-01 09:07:44 2017-11-01 09:07:44 625
6: 7 2017-11-01 09:07:48 625 2017-11-01 09:46:16 2017-11-01 09:46:16 469