我有一个数据集,其中包含三列:用户,操作和时间,这是用户操作的日志。数据如下所示:
user action time
1: 618663 34 1407160424
2: 617608 33 1407160425
3: 89514 34 1407160425
4: 71160 33 1407160425
5: 443464 32 1407160426
---
996: 146038 8 1407161349
997: 528997 9 1407161350
998: 804302 8 1407161351
999: 308922 8 1407161351
1000: 803763 8 1407161352
我想根据操作时间为每个用户分隔会话。在某个时期(例如一小时)内完成的操作将被假定为一个会话。 简单的解决方案是使用for循环并比较每个用户的操作时间,但这样做效率不高,而且我的数据非常大。 有什么方法可以用来克服这个问题吗? 我可以对用户进行分组,但将用户操作分成不同的会话对我来说有点困难: - )
答案 0 :(得分:3)
尝试
library(data.table)
dt <- rbind(
data.table(user=1, action=1:10, time=c(1,5,10,11,15,20,22:25)),
data.table(user=2, action=1:5, time=c(1,3,10,11,12))
)
# dt[, session:=cumsum(c(T, !(diff(time)<=2))), by=user][]
# user action time session
# 1: 1 1 1 1
# 2: 1 2 5 2
# 3: 1 3 10 3
# 4: 1 4 11 3
# 5: 1 5 15 4
# 6: 1 6 20 5
# 7: 1 7 22 5
# 8: 1 8 23 5
# 9: 1 9 24 5
# 10: 1 10 25 5
# 11: 2 1 1 1
# 12: 2 2 3 1
# 13: 2 3 10 2
# 14: 2 4 11 2
# 15: 2 5 12 2
我使用<=2
的差异来收集会话。