r - 创建网络 session

标签 r

我知道兰迪在 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/

相关文章:

r - 在 R 中合并大数据集并标记不匹配的数据集

r - 使用docker时如何运行带有入口点的Rscript?

r - 文本挖掘稀疏/非稀疏意义

r - 计算所选列值的行数并根据 R 中的计数删除行

r - 展开 data.frame/table

algorithm - 当 n = 0 时,编程语言对 {1,...,n} 的解释是否一致?

r - 有没有办法使用R读取Qlikview数据对象并执行统计操作并将结果返回到Qlikview?

r - 计算多个数据帧的平均值

r - 如何使用 R ggplot 按值对条形图进行排序?

r - 如何将数据框中的部分重复项设置为空