基于数据框生成点击流序列: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
相关产品推荐
相关产品推荐

