我有两个数据表-xtab
和ytab
。
> xtab
id created_at updated_at
1: 95473 2019-02-01 03:36:34 2019-02-01 03:52:44
2: 95473 2019-02-07 23:35:46 2019-02-07 23:59:13
3: 95473 2019-02-09 00:05:43 2019-02-09 00:24:59
4: 95473 2019-02-13 02:21:15 2019-02-13 02:49:24
5: 95473 2019-02-13 23:48:55 2019-02-14 00:17:32
6: 4268 2019-02-15 15:59:01 2019-02-15 16:21:07
7: 28780 2019-02-23 19:52:06 2019-02-23 20:05:06
8: 27685 2019-02-24 02:00:58 2019-02-24 02:12:05
9: 55837 2019-02-26 17:36:16 2019-02-26 17:50:17
10: 95473 2019-02-28 00:02:51 2019-02-28 00:25:44
> ytab
row_id user_id timeA timeB
1: 14E85AF4-6CA4-483B-B972-40C37FDB4B28 95473 2019-02-01 03:52:43 2019-02-01 03:36:31
2: A325F4FB-B5F6-4BAF-AFA3-F5D43EC4190F 95473 2019-02-07 23:59:12 2019-02-07 23:35:43
3: DF54F75D-5EC3-4505-89DD-1C669AEE2504 95473 2019-02-09 00:24:58 2019-02-09 00:05:40
4: 2E4FCB46-8564-4BB3-8A32-AE61F72615F4 95473 2019-02-13 02:49:23 2019-02-13 02:12:34
5: 67852185-DF3F-4916-BAD3-4B8EEB6397E3 95473 2019-02-14 00:16:53 2019-02-13 23:48:52
6: A2C0B283-4D26-4FA1-8A64-76E31F603828 4268 2019-02-15 16:21:06 2019-02-15 15:58:58
7: 0249A8DF-9FA9-49B7-B604-0F37B4031A56 28780 2019-02-23 20:05:05 2019-02-23 19:52:01
8: 4F29038B-8A7E-4038-B18A-AAE7BEE32212 27685 2019-02-24 02:12:04 2019-02-24 02:00:54
9: DCDB7020-65DB-4067-94F5-ED2E36255458 55837 2019-02-26 17:50:16 2019-02-26 17:36:12
10: 64BA0A31-3DF2-4819-A2F7-BF732DD0587E 95473 2019-02-28 00:25:43 2019-02-28 00:02:48
我的目标是对两个单独的变量执行联接-首先是xtab$id = ytab$user_id
,然后在xtab$updated_at
和ytab$timeA
之间的最近时间进行滚动联接
以下代码有效,但是有两个问题-首先,它只是基于时间的联接,其次,输出中缺少键timeA
。为什么会这样?有没有一种方法可以按时执行滚动连接以及ID,如何将ytab
键保留在输出中?
library(data.table)
setDT(xtab)
setDT(ytab)
setkey(xtab, updated_at)
setkey(ytab, timeA)
xtab[ytab, roll = 'nearest']
id created_at updated_at row_id user_id timeB
1: 95473 2019-02-01 03:36:34 2019-02-01 03:52:43 14E85AF4-6CA4-483B-B972-40C37FDB4B28 95473 2019-02-01 03:36:31
2: 95473 2019-02-07 23:35:46 2019-02-07 23:59:12 A325F4FB-B5F6-4BAF-AFA3-F5D43EC4190F 95473 2019-02-07 23:35:43
3: 95473 2019-02-09 00:05:43 2019-02-09 00:24:58 DF54F75D-5EC3-4505-89DD-1C669AEE2504 95473 2019-02-09 00:05:40
4: 95473 2019-02-13 02:21:15 2019-02-13 02:49:23 2E4FCB46-8564-4BB3-8A32-AE61F72615F4 95473 2019-02-13 02:12:34
5: 95473 2019-02-13 23:48:55 2019-02-14 00:16:53 67852185-DF3F-4916-BAD3-4B8EEB6397E3 95473 2019-02-13 23:48:52
6: 4268 2019-02-15 15:59:01 2019-02-15 16:21:06 A2C0B283-4D26-4FA1-8A64-76E31F603828 4268 2019-02-15 15:58:58
7: 28780 2019-02-23 19:52:06 2019-02-23 20:05:05 0249A8DF-9FA9-49B7-B604-0F37B4031A56 28780 2019-02-23 19:52:01
8: 27685 2019-02-24 02:00:58 2019-02-24 02:12:04 4F29038B-8A7E-4038-B18A-AAE7BEE32212 27685 2019-02-24 02:00:54
9: 55837 2019-02-26 17:36:16 2019-02-26 17:50:16 DCDB7020-65DB-4067-94F5-ED2E36255458 55837 2019-02-26 17:36:12
10: 95473 2019-02-28 00:02:51 2019-02-28 00:25:43 64BA0A31-3DF2-4819-A2F7-BF732DD0587E 95473 2019-02-28 00:02:48
答案 0 :(得分:2)
这是做您想要的事情的一种方法。首先,我用setkey(DT, key1, key2)
设置了多个键。 roll
将在setkey
语句的最后一项上完成。其次,我将日期/时间列转换为as.POSIXct
对象。最后,我使用i.
添加通常在合并中不显示的列。
library(data.table)
setDT(xtab)
setDT(ytab)
xtab[,updated_at:=as.POSIXct(updated_at, "%Y-%m-%d %H:%M:%S", tz = "GMT")]
ytab[,timeA:=as.POSIXct(timeA, "%Y-%m-%d %H:%M:%S", tz = "GMT")]
setkey(xtab, id, updated_at )
setkey(ytab, user_id, timeA )
res <- xtab[ytab, roll="nearest", `:=`(timeA=i.timeA, timeB=i.timeB, row_id=i.row_id) ]
res
> res
id created_at updated_at timeA timeB
1: 4268 2019-02-15 15:59:01 2019-02-15 16:21:07 2019-02-15 16:21:06 2019-02-15 15:58:58
2: 27685 2019-02-24 02:00:58 2019-02-24 02:12:05 2019-02-24 02:12:04 2019-02-24 02:00:54
3: 28780 2019-02-23 19:52:06 2019-02-23 20:05:06 2019-02-23 20:05:05 2019-02-23 19:52:01
4: 55837 2019-02-26 17:36:16 2019-02-26 17:50:17 2019-02-26 17:50:16 2019-02-26 17:36:12
5: 95473 2019-02-01 03:36:34 2019-02-01 03:52:44 2019-02-01 03:52:43 2019-02-01 03:36:31
6: 95473 2019-02-07 23:35:46 2019-02-07 23:59:13 2019-02-07 23:59:12 2019-02-07 23:35:43
7: 95473 2019-02-09 00:05:43 2019-02-09 00:24:59 2019-02-09 00:24:58 2019-02-09 00:05:40
8: 95473 2019-02-13 02:21:15 2019-02-13 02:49:24 2019-02-13 02:49:23 2019-02-13 02:12:34
9: 95473 2019-02-13 23:48:55 2019-02-14 00:17:32 2019-02-14 00:16:53 2019-02-13 23:48:52
10: 95473 2019-02-28 00:02:51 2019-02-28 00:25:44 2019-02-28 00:25:43 2019-02-28 00:02:48
row_id
1: A2C0B283-4D26-4FA1-8A64-76E31F603828
2: 4F29038B-8A7E-4038-B18A-AAE7BEE32212
3: 0249A8DF-9FA9-49B7-B604-0F37B4031A56
4: DCDB7020-65DB-4067-94F5-ED2E36255458
5: 14E85AF4-6CA4-483B-B972-40C37FDB4B28
6: A325F4FB-B5F6-4BAF-AFA3-F5D43EC4190F
7: DF54F75D-5EC3-4505-89DD-1C669AEE2504
8: 2E4FCB46-8564-4BB3-8A32-AE61F72615F4
9: 67852185-DF3F-4916-BAD3-4B8EEB6397E3
10: 64BA0A31-3DF2-4819-A2F7-BF732DD0587E