如何捕获所有成功的会话?

How to capture all successfull sessions?

我有一个传感器可以捕获用户 ID 会话状态的每个阶段。所以session id有四种。

1-会话开始

2,3-会话中间

4-会话结束

传感器有时会失败,无法捕获某个 ID 的所有会话状态。

所以我的数据 table 如下所示:

 DT = data.table(
  id = c(rep(1, 12),rep(2,4)),
  datetime = c(
    "2017-01-06 18:49:40",
    "2017-01-06 18:58:23",
    "2017-01-06 19:41:34",
    "2017-01-09 10:11:34",
    "2017-01-09 10:20:35",
    "2017-01-10 06:12:30",
    "2017-01-12 18:02:52",
    "2017-01-12 18:08:30",
    "2017-01-12 18:28:44",
    "2017-01-12 18:32:03",
    "2017-01-15 01:03:12",
    "2017-01-15 01:03:58",
    "2017-01-02 02:35:54",
    "2017-01-04 22:52:54",
    "2017-01-04 23:03:33",
    "2017-01-04 23:11:20"
  ),
  session_id = c(1, 3, 4, 1, 2, 1, 1, 2, 3, 4, 3, 4, 2, 1, 3, 4)
)

据此,我想获取所有已完成的会话(可以从第一个会话(1 或 2 或 3)开始并且必须有一个状态为 4 的结束会话)来计算每个已完成会话的时间对于每个用户。

因此,我需要按照以下方式获取已完成的会话 table:

     resultDT = data.table(
  id = c(rep(1, 9),rep(2,3)),
  datetime = c(
    "2017-01-06 18:49:40",
    "2017-01-06 18:58:23",
    "2017-01-06 19:41:34",
    "2017-01-12 18:02:52",
    "2017-01-12 18:08:30",
    "2017-01-12 18:28:44",
    "2017-01-12 18:32:03",
    "2017-01-15 01:03:12",
    "2017-01-15 01:03:58",
    "2017-01-04 22:52:54",
    "2017-01-04 23:03:33",
    "2017-01-04 23:11:20"
  ),
  session_id = c(1, 3, 4, 1, 2, 3, 4, 3, 4,1,3,4),
  same_group = c(1, 1, 1, 2, 2, 2, 2, 3, 3,4,4,4)
)

所以我尝试最初将所有以 4 结尾的组分组并过滤,然后再次按 cumsum 分配相同的组。

DT[, same_group:= shift(cumsum(session_id==4L), fill=0L),list(id)]

但是这个失败直到发现 4(在某些情况下将多个会话合并为一个)。

感谢任何帮助。

希望有更简单的方法来执行此操作,但听起来这就是您要找的方法。希望这有帮助!!

# Mark session_id 4 w/ group #
DT[session_id == 4, same_group := cumsum(!is.na(session_id))]

# Fill in the group variable
DT[, same_group := nafill(same_group, "nocb")] 

# Filter by removing duplicates in reverse (by groups) & ensuring the value is larger than the previous value
DT[DT[, .I[!duplicated(session_id, fromLast = TRUE) & c((session_id > shift(session_id))[-1], TRUE)], by = .(id, same_group)]$V1]
    id            datetime session_id same_group
 1:  1 2017-01-06 18:49:40          1          1
 2:  1 2017-01-06 18:58:23          3          1
 3:  1 2017-01-06 19:41:34          4          1
 4:  1 2017-01-12 18:02:52          1          2
 5:  1 2017-01-12 18:08:30          2          2
 6:  1 2017-01-12 18:28:44          3          2
 7:  1 2017-01-12 18:32:03          4          2
 8:  1 2017-01-15 01:03:12          3          3
 9:  1 2017-01-15 01:03:58          4          3
10:  2 2017-01-04 22:52:54          1          4
11:  2 2017-01-04 23:03:33          3          4
12:  2 2017-01-04 23:11:20          4          4

EDIT:通过将 id 添加到最后一个 by 语句来更新新示例。如果您决定要 same_group 与每个 id 一起重置,只需在第一行将 id 添加到 by