You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于行间时间差分组:为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:04:13