我知道兰迪在 Sessonizing Log Data 上发表了一篇很棒的帖子,但我正在努力调整想法以根据 30 分钟不活动窗口生成 session ID。
这是我希望在 R
中生成的内容,最好是使用 dplyr
生成。我正在计算如下所示的 session_id
变量。
dim_user_id activity_date session_id
1 2665871 2014-12-31 19:00:08 1
2 2665871 2014-12-31 19:00:45 1
3 2665871 2014-12-31 19:01:01 1
4 2665877 2014-12-31 19:00:08 2
5 2665877 2014-12-31 19:00:33 2
6 2666612 2014-12-31 19:08:19 3
7 2666612 2014-12-31 19:08:32 3
8 2666612 2014-12-31 19:09:04 3
9 2666626 2014-12-31 19:00:25 4
10 2666627 2014-12-31 19:04:39 5
我尝试使用的代码是:
user_activity$sid = 1:nrow(user_activity)
user_activity$session_id = NA
# startTime = Sys.time()
user_activity = user_activity %>%
group_by(dim_user_id) %>%
arrange(activity_date) %>%
transform(lag_seconds = ifelse(lag(dim_user_id) == dim_user_id,
as.numeric(activity_date - lag(activity_date)),
9999)) %>%
mutate(session_id = ifelse(is.na(lag_seconds) | lag_seconds >= 1801, sid, lag(session_id)))
但我遇到的问题是我不相信该值是按行设置的。我确实探索了 dplyr
中的 rowwwise
函数,但我被卡住了。
提前致谢。
最佳答案
如果我理解正确,您正在寻找group_indices
,您可以按如下方式使用它:
df %>% mutate(session_id = group_indices_(df, .dots="dim_user_id"))
编辑: 由于您的示例数据没有提供一个用户具有 30 多个时间差异的多个 session 的情况,因此我使用了这个更改后的数据集:
df <- read.table(header=TRUE, text="dim_user_id date time
2665871 2014-12-31 19:00:08
2665871 2014-12-31 19:00:45
2665871 2014-12-31 19:01:01
2665877 2014-12-31 19:00:08
2665877 2014-12-31 19:00:33
2666612 2014-12-31 19:08:19
2666612 2014-12-31 19:38:32
2666612 2014-12-31 19:39:04
2666626 2014-12-31 19:00:25
2666627 2014-12-31 19:04:39")
df$activity_date <- as.POSIXct(paste(df$date, df$time))
df$date <- NULL
df$time <- NULL
因此用户 #2666612 有 30 分钟以上的延迟。以下代码逐步计算您的session_id。我确信它可以缩短,但这是为了澄清。
require(dplyr)
cuttoff <- 30*60 # 30 min times 60 seconds.
df %>%
# group by user_id
group_by(dim_user_id) %>%
# Difference in seconds within a given user
mutate(time_diff = c(0, diff(activity_date))) %>%
# If the difference is >cutoff start new session
mutate(session_num = cumsum(time_diff>cuttoff)) %>%
# ungroup to set group_indices data-wide instead of groupwide
ungroup() %>%
# calculate group_indices based in user_id and session_num
mutate(session_id = group_indices_(., .dots=c("dim_user_id", "session_num")))
结果是:
Source: local data frame [10 x 5]
dim_user_id activity_date time_diff session_num session_id
(int) (time) (dbl) (int) (int)
1 2665871 2014-12-31 19:00:08 0 0 1
2 2665871 2014-12-31 19:00:45 37 0 1
3 2665871 2014-12-31 19:01:01 16 0 1
4 2665877 2014-12-31 19:00:08 0 0 2
5 2665877 2014-12-31 19:00:33 25 0 2
6 2666612 2014-12-31 19:08:19 0 0 3
7 2666612 2014-12-31 19:38:32 1813 1 4
8 2666612 2014-12-31 19:39:04 32 1 4
9 2666626 2014-12-31 19:00:25 0 0 5
10 2666627 2014-12-31 19:04:39 0 0 6
关于r - 创建网络 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39103791/