基于行间时间差分组:为data.frame创建session变量
如何根据时间间隔为数据框创建会话分组变量
这问题我处理类似时序数据时也碰到过,用dplyr的累加函数就能轻松实现需求,给你一步步拆解:
1. 先准备示例数据
首先我们还原你提供的示例数据(用hms类型构造时间列):
library(dplyr) library(hms) # 构造示例数据框 df <- tibble( hour = hms::hms(c(57485, 57491, 57497, 57524, 57531, 57537)), time_elapsed = c(NA, 6, 6, 27, 7, 6) )
2. 核心逻辑实现
我们的思路是:标记出时间间隔超过阈值的行,然后通过累加标记值生成会话编号。这里直接用时间列计算间隔(比依赖已有的time_elapsed更可靠),代码如下:
# 设置时间间隔阈值 threshold <- 25 df <- df %>% # 计算相邻观测的时间间隔(第一行无前置观测,设为NA) mutate(interval = c(NA, diff(hour))) %>% # 标记是否开启新会话:间隔超过阈值则标记为1,否则0 mutate(is_new_session = ifelse(is.na(interval) | interval <= threshold, 0, 1)) %>% # 累加标记值,再加1得到会话编号(初始会话从1开始) mutate(session = cumsum(is_new_session) + 1) %>% # 移除中间临时列(可选) select(-interval, -is_new_session)
3. 查看结果
运行完上面的代码后,你就能得到期望的结果:
df #> # A tibble: 6 × 3 #> hour time_elapsed session #> <time> <dbl> <dbl> #> 1 15:58:05 NA 1 #> 2 15:58:11 6 1 #> 3 15:58:17 6 1 #> 4 15:58:44 27 2 #> 5 15:58:51 7 2 #> 6 15:58:57 6 2
简化版(如果信任已有time_elapsed列)
如果你确认time_elapsed列的间隔数据是准确的,可以直接用它来简化代码:
df <- df %>% mutate( is_new_session = ifelse(is.na(time_elapsed) | time_elapsed <= threshold, 0, 1), session = cumsum(is_new_session) + 1 )
内容的提问来源于stack exchange,提问作者Bruno Ritter
相关产品推荐
相关产品推荐

