如何基于上次响应时间建模事件响应权限(附R数据示例)
实现事件响应判断的R代码
需求概述
需要为给定的事件数据生成respond_col列,标记事件是否可响应,需满足两个核心条件:
- 响应时间窗口限制:仅在7:00-23:00之间允许响应事件
- 响应间隔限制:两次响应的间隔必须超过90分钟,即当前事件与最近一次成功响应的时间差需大于90分钟
示例数据
df <- structure(list(event_day = c(0L, 0L, 0L, 0L, 0L, 0L), event_hr = c(1, 8, 9, 9, 10, 12), event_minute = c(41L, 25L, 22L, 41L, 26L, 1L ), onset_time = c(101, 505, 562, 581, 626, 721)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
实现代码
library(dplyr) df <- df %>% # 第一步:判断事件是否在允许响应的时间窗口内 mutate(in_window = ifelse(event_hr >=7 & event_hr <=23, 1, 0)) %>% # 初始化响应标记列 mutate(respond_col = 0) %>% rowwise() %>% # 跟踪当前行之前最近一次成功响应的时间 mutate( last_respond_time = ifelse(row_number() == 1, ifelse(in_window == 1, onset_time, -Inf), max(filter(df[1:(row_number()-1), ], respond_col == 1)$onset_time, na.rm = TRUE)) ) %>% ungroup() %>% # 综合两个条件判断是否可响应 mutate(respond_col = ifelse(in_window == 1 & (onset_time - last_respond_time) > 90, 1, 0)) %>% # 修正第一行的特殊判断逻辑 mutate(respond_col = case_when( row_number() == 1 & in_window == 0 ~ 0, row_number() == 1 & in_window == 1 ~ 1, TRUE ~ respond_col )) %>% # 移除中间辅助列 select(-in_window, -last_respond_time)
结果验证
运行代码后,respond_col列的输出结果为:[0, 1, 0, 0, 1, 1],与预期完全匹配。
代码逻辑说明
- 时间窗口校验:通过
event_hr判断事件是否处于7:00-23:00的可响应时段 - 历史响应时间跟踪:逐行提取当前行之前最近一次成功响应的事件时间,第一行无历史数据时做特殊处理
- 响应权限判断:同时满足「在可响应时段内」和「与上次响应间隔超过90分钟」两个条件时,标记为可响应(1),否则标记为不可响应(0)
- 特殊场景修正:单独处理第一行的判断逻辑,确保符合业务规则
内容的提问来源于stack exchange,提问作者Peter9991
相关产品推荐
相关产品推荐

