基于8小时间隔合并时间戳识别独立访问的R技术问题
基于8小时间隔合并时间戳的R实现方案
需求说明
基于8小时间隔规则合并时间戳区间:当同一id下,某事件的end_timestamp与下一个事件的start_timestamp间隔≥8小时,视为独立事件;否则合并这两个区间,取该组事件的最小start_timestamp和最大end_timestamp。
输入数据
df <- data.frame(id = c("A", "A", "A", "A", "A", "A", "B", "B"), start_timestamp = c("2022-04-26 23:36:00", "2022-04-27 18:29:00", "2022-04-29 11:37:00", "2022-05-02 22:29:00", "2022-05-10 10:06:00", "2022-05-12 19:57:00", "2022-04-01 12:00:00", "2022-04-04 15:35:00"), end_timestamp = c("2022-04-27 12:28:00", "2022-04-29 07:00:00", "2022-05-02 13:41:00", "2022-05-10 09:00:00", "2022-05-12 15:16:00", "2022-05-15 15:12:00", "2022-04-04 11:49:00", "2022-04-07 11:42:00")) df$start_timestamp <- as.POSIXct(df$start_timestamp) df$end_timestamp <- as.POSIXct(df$end_timestamp)
输入数据预览:
> df id start_timestamp end_timestamp 1 A 2022-04-26 23:36:00 2022-04-27 12:28:00 2 A 2022-04-27 18:29:00 2022-04-29 07:00:00 3 A 2022-04-29 11:37:00 2022-05-02 13:41:00 4 A 2022-05-02 22:29:00 2022-05-10 09:00:00 5 A 2022-05-10 10:06:00 2022-05-12 15:16:00 6 A 2022-05-12 19:57:00 2022-05-15 15:12:00 7 B 2022-04-01 12:00:00 2022-04-04 11:49:00 8 B 2022-04-04 15:35:00 2022-04-07 11:42:00
期望输出
> df id visit start_timestamp end_timestamp 1 A 0 2022-04-26 23:36:00 2022-05-02 13:41:00 2 A 1 2022-05-02 22:29:00 2022-05-15 15:12:00 3 B 0 2022-04-01 12:00:00 2022-04-07 11:42:00
解决方案代码
使用dplyr包处理分组、标记和聚合:
library(dplyr) result_df <- df %>% group_by(id) %>% # 计算当前行start与前一行end的时间差(单位:小时),第一行设为NA mutate(time_diff_hours = difftime(start_timestamp, lag(end_timestamp), units = "hours")) %>% # 标记是否需要开启新的visit:时间差≥8小时或为第一行时,标记为1,否则0 mutate(new_visit = ifelse(is.na(time_diff_hours) | time_diff_hours >= 8, 1, 0)) %>% # 累加new_visit生成visit分组编号,从0开始 mutate(visit = cumsum(new_visit) - 1) %>% # 按id和visit分组,聚合最小start和最大end group_by(id, visit) %>% summarise(start_timestamp = min(start_timestamp), end_timestamp = max(end_timestamp), .groups = "drop") print(result_df)
代码解释
- 分组计算时间差:按
id分组后,用lag()函数获取前一行的end_timestamp,计算当前行start_timestamp与它的时间差(单位为小时)。 - 标记新事件组:第一行无前置事件,直接标记为新组;若时间差≥8小时,也标记为新组。
- 生成visit编号:通过累加
new_visit的值,将连续的非独立事件归为同一个visit组,编号从0开始。 - 聚合区间:按
id和visit分组,取每组的最小start_timestamp和最大end_timestamp,得到合并后的结果。
内容的提问来源于stack exchange,提问作者nlp
相关产品推荐
相关产品推荐

