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

基于数据框生成点击流序列:mutate与lead()函数联用方法

R语言实现点击流明细表计算方案

你要的逻辑用dplyr包的分组操作配合mutate()、lead()函数可以直接实现,不需要写自定义循环,以下是可直接运行的完整实现:


步骤1:加载依赖、准备原始数据

首先加载需要的包,按照你给出的样例构造测试数据框:

library(dplyr)
library(hms) # 处理时分秒格式时间戳

# 构造样例原始数据
raw_click <- tibble(
  `User ID` = c(123, 123, 123, 123, 123, 122, 122, 128, 128),
  `Session ID` = c("123.4", "123.4", "123.4", "123.4", "123.4", "1299.1", "1299.1", "124.4", "124.4"),
  `Time Stamp` = as_hms(c("00:00:01", "00:00:02", "00:00:05", "00:00:10", "00:00:11",
                          "00:00:01", "00:00:02",
                          "00:00:01", "00:00:02")),
  Page = c(1, 2, 3, 4, 5, 2, 3, 1, 2)
)

注:样例里把时间戳的HH:MM替换成了00:00方便直接运行,你用自己真实时间戳替换即可,不影响计算逻辑


步骤2:核心计算逻辑

lead()函数的作用是返回序列中当前位置向后偏移n位的数值,默认偏移1位、序列末尾空缺值返回NA,正好匹配下一跳取值的需求。
注意:必须先按会话分组再调用lead(),否则会跨会话取到错误的下一跳数据

clean_click <- raw_click %>%
  # 按会话ID分组
  group_by(`Session ID`) %>%
  # 同会话内按访问时间戳升序排列,保证访问顺序正确
  arrange(`Time Stamp`, .by_group = TRUE) %>%
  mutate(
    # 取同组下一条记录的Page作为当前记录的下一跳页面
    `Next Page` = lead(Page),
    # 计算当前记录到下一条记录的时间差,转为秒级数值
    `Duration (secs)` = as.numeric(lead(`Time Stamp`) - `Time Stamp`, units = "secs")
  ) %>%
  # 剔除每个会话最后一条无下一跳的记录(Next Page为NA的行)
  filter(!is.na(`Next Page`)) %>%
  # 解除分组,方便后续其他操作
  ungroup()

结果校验

运行上述代码后得到的结果和你预期完全一致:

  • 会话123.4保留4条记录:页面1→2停留1秒、2→3停留3秒、3→4停留5秒、4→5停留1秒
  • 会话1299.1保留1条记录:页面2→3停留1秒
  • 会话124.4保留1条记录:页面1→2停留1秒

常见踩坑点

  • 不要在未分组的情况下直接调用lead(),会导致不同会话的首尾访问记录被错误判定为跳转关系
  • 必须先按时间戳排序再计算,原始数据如果存在同会话内时间乱序的情况,计算出的跳转路径和停留时长会完全错误
  • 时间差计算后要显式转为数值型,否则会返回difftime格式对象,后续做聚合、统计时容易出现类型报错

内容的提问来源于stack exchange,提问作者user2845095

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:18:18