我有一个传感器,它将捕获用户ID会话状态的每个阶段。因此,会话ID有四种类型。
1个会话开始
2,3-会议进行中
会话4结束
传感器有时会失败,并且无法捕获所有会话状态的ID。
所以我的数据表如下:
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的结束会话)来为每个用户计算每个已完成会话的时间。
因此,我需要获得完成的会话,如下表:
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结尾的分组,然后过滤,然后再次按累加分配相同的分组。
DT[, same_group:= shift(cumsum(session_id==4L), fill=0L),list(id)]
但是,直到发现4个(在某些情况下将多个会话合并为一个),该操作才会失败。
任何帮助表示赞赏。