Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何执行按ID分组的最近时间戳的rolljoin?_R_Dplyr_Data.table - Fatal编程技术网

如何执行按ID分组的最近时间戳的rolljoin?

如何执行按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:

我有两个数据表,如下所示

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:           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