我有一个类似的问题(创建一个"sessionID"基于"userID"和"timeStamp"的差异)创建一个'会话ID'; 虽然我的规格略有不同.也许这个解决方案在这篇文章中仍然很明显,但我无法将其应用到我的需求中 - 指出原始解决方案如何满足我的问题将是等效的.
我data.table看起来像这样(下面有输入):
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
Run Code Online (Sandbox Code Playgroud)
NB: datetime被转换为lubridatevia中的日期对象ymd_hms(datetime)
我想要的是一个标识会话的新变量,它是一个简单的整数序列(不需要像原始问题那样包含visitorID) - 会话由访问者定义,只要记录<= 30m并在同一天内.因此,例如,前两行将是两个不同的会话:虽然它是相同的访问者,但时间差异> 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
Run Code Online (Sandbox Code Playgroud)
如果这可以通过某种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))
Run Code Online (Sandbox Code Playgroud)
假设您的数据框最初按访客ID和日期时间排序,您可以使用cumsum()条件向量,该向量为TRUE,其中session_id应出现新的:
myDT[, session_id := cumsum(c(T, diff(unique_visitor_id) != 0 | diff(datetime)/60 > 30))][]
# unique_visitor_id datetime session_id
# 1: 100 2016-07-25 15:43:02 1
# 2: 100 2016-08-15 15:35:16 2
# 3: 101 2016-08-01 21:24:46 3
# 4: 101 2016-08-13 05:32:27 4
# 5: 101 2016-08-13 05:33:01 4
# 6: 101 2016-08-13 05:33:37 4
# 7: 101 2016-08-13 05:34:04 4
# 8: 101 2016-08-13 05:37:42 4
# 9: 101 2016-08-13 05:38:20 4
#10: 102 2016-09-15 17:28:00 5
#11: 102 2016-09-15 17:31:04 5
#12: 103 2016-07-18 21:19:07 6
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |