【发布时间】:2017-08-31 19:54:39
【问题描述】:
我有一个结构如下的数据集:
structure(list(id = c(43956L, 46640L, 71548L, 71548L, 71548L,
72029L, 72029L, 74558L, 74558L, 100596L, 100596L, 100596L, 104630L,
104630L, 104630L, 104630L, 104630L, 104630L, 104630L, 104630L
), event = c("LOGIN", "LOGIN", "LOGIN", "LOGIN", "LOGOUT", "LOGIN",
"LOGOUT", "LOGIN", "LOGOUT", "LOGIN", "LOGOUT", "LOGIN", "LOGIN",
"LOGIN", "LOGIN", "LOGIN", "LOGIN", "LOGOUT", "LOGIN", "LOGOUT"
), timestamp = c("2017-03-27 09:19:29", "2016-06-10 00:09:08",
"2016-01-27 12:00:25", "2016-06-20 11:34:29", "2016-06-20 11:35:44",
"2016-12-28 10:43:25", "2016-12-28 10:56:30", "2016-10-15 15:08:39",
"2016-10-15 15:10:06", "2016-03-09 14:30:48", "2016-03-09 14:31:10",
"2017-04-03 10:36:54", "2016-01-11 16:52:08", "2016-02-03 14:40:32",
"2016-03-30 12:34:56", "2016-05-26 13:14:25", "2016-08-22 15:20:02",
"2016-08-22 15:21:53", "2016-08-22 15:22:23", "2016-08-22 15:23:08"
)), .Names = c("id", "event", "timestamp"), row.names = c(5447L,
5446L, 5443L, 5444L, 5445L, 5441L, 5442L, 5439L, 5440L, 5436L,
5437L, 5438L, 5425L, 5426L, 5427L, 5428L, 5429L, 5430L, 5431L,
5432L), class = "data.frame")
id event timestamp
5447 43956 LOGIN 2017-03-27 09:19:29
5446 46640 LOGIN 2016-06-10 00:09:08
5443 71548 LOGIN 2016-01-27 12:00:25
5444 71548 LOGIN 2016-06-20 11:34:29
5445 71548 LOGOUT 2016-06-20 11:35:44
5441 72029 LOGIN 2016-12-28 10:43:25
5442 72029 LOGOUT 2016-12-28 10:56:30
5439 74558 LOGIN 2016-10-15 15:08:39
5440 74558 LOGOUT 2016-10-15 15:10:06
5436 100596 LOGIN 2016-03-09 14:30:48
5437 100596 LOGOUT 2016-03-09 14:31:10
5438 100596 LOGIN 2017-04-03 10:36:54
5425 104630 LOGIN 2016-01-11 16:52:08
5426 104630 LOGIN 2016-02-03 14:40:32
5427 104630 LOGIN 2016-03-30 12:34:56
5428 104630 LOGIN 2016-05-26 13:14:25
5429 104630 LOGIN 2016-08-22 15:20:02
5430 104630 LOGOUT 2016-08-22 15:21:53
5431 104630 LOGIN 2016-08-22 15:22:23
5432 104630 LOGOUT 2016-08-22 15:23:08
我希望计算LOGIN 和LOGOUT(会话持续时间)之间以及LOGOUT 和LOGIN(会话间隔)之间的时间差。不幸的是,我的 LOGIN 事件没有匹配的 LOGOUT 事件。
正确的LOGOUT 事件始终遵循其对应的LOGIN 事件(因为我根据id 和timestamp 订购了数据框。我尝试调整this answer,但没有运气。我也尝试创建一个事件标识符,但由于我找不到让LOGOUT 事件的编号与LOGIN 事件的编号相匹配的方法,我不确定这样的标识符会有多大用处:
df$eventNum <- as.numeric(ave(as.character(df$id), df$id, as.character(df$event), FUN = seq_along))
【问题讨论】:
-
您是否尝试过在 dplyr 包的 mutate 中使用 lag 函数?如果您按 id 和日期排序,然后按 id 分组,它应该可以工作
-
如果我这样做,我会创建一个滞后的时间戳以及事件。然后我遇到的问题是创建一个变量,该变量定义当前时间戳与前一个时间戳之间的差异是会话持续时间还是间隔的一部分。我可以用
ifelse()声明来解决这个问题:statistic=ifelse(event==lastevent, NA, ifelse(event=="LOGIN", "duration", "interval"))。但是,这跨越了id级别。