如何捕获所有成功的会话?
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
。
我有一个传感器可以捕获用户 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
。