我有一个与此问题(根据“userID”和“timeStamp”的差异创建“sessionID”)类似的问题,但我的规格略有不同。也许解决方案仍然显而易见,但我无法将其应用于我的需求——指出原始解决方案如何满足我的问题将是等效的。
我的
我的
data.table
看起来像这样(以下是可用的dput):unique_visitor_id datetime
100 2016-07-25 15:43:02
100 2016-08-15 15:35:16
101 2016-08-01 21:24:46
101 2016-08-13 05:32:27
101 2016-08-13 05:33:01
101 2016-08-13 05:33:37
101 2016-08-13 05:34:04
101 2016-08-13 05:37:42
101 2016-08-13 05:38:20
102 2016-09-15 17:28:00
102 2016-09-15 17:31:04
103 2016-07-18 21:19:07
NB: datetime
已经通过ymd_hms(datetime)
在lubridate
中被转换为日期对象。
我的需求是创建一个新的变量来识别会话,该变量是一个简单的整数序列(不需要包含visitorID,就像原始问题一样)- 只要记录是< = 30分钟且在同一天内,会话就由访问者定义。因此,例如,前两行将是两个不同的会话:尽管是同一位访问者,但时间差异大于30分钟。
以上数据的期望输出将是:
unique_visitor_id datetime session_id
100 2016-07-25 15:43:02 1
100 2016-08-15 15:35:16 2
101 2016-08-01 21:24:46 3
101 2016-08-13 05:32:27 4
101 2016-08-13 05:33:01 4
101 2016-08-13 05:33:37 4
101 2016-08-13 05:34:04 4
101 2016-08-13 05:37:42 4
101 2016-08-13 05:38:20 4
102 2016-09-15 17:28:00 5
102 2016-09-15 17:31:04 5
103 2016-07-18 21:19:07 6
如果可以用data.table
的方式完成,那将是理想的。再次道歉,如果我在原问题的解决方案中错过了什么!
这里是dput
样本数据表:
myDT <- structure(list(unique_visitor_id = c(100L, 100L, 101L,
101L, 101L, 101L, 101L, 101L, 101L, 102L, 102L, 103L),
datetime = structure(c(1469475782, 1471289716, 1470101086, 1471080747, 1471080781,
1471080817, 1471080844, 1471081062, 1471081100, 1473974880,
1473975064, 1468891147),
tzone = "EST5EDT", class = c("POSIXct", "POSIXt"))),
.Names = c("unique_visitor_id", "datetime"),
sorted = c("unique_visitor_id", "datetime"),
class = c("data.table", "data.frame"),
row.names = c(NA, -12L))
| diff(date(datetime)) != 0))]
- daRknight