数据表滚动连接中缺少键

时间:2019-03-16 20:14:02

标签: r join dplyr data.table

我有两个数据表-xtabytab

> 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_atytab$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

1 个答案:

答案 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