基于固定时间间隔的滚动窗口计数实现方案问询
解决方案
针对你需要基于可变时长的滚动窗口统计数据点数量的需求,以下两种方法都能实现,且支持灵活调整窗口时长:
方法一:用purrr逐行计算(直观易上手)
核心逻辑是对每个时间点,统计所有数据中落在「当前时间 - N小时」到「当前时间」范围内的记录数,通过参数window_hours可随时调整窗口时长。
library(tidyverse) library(lubridate) # 示例数据 df = tibble(id = 1:7, date_time = ymd_hm('2022-05-07 15:00', '2022-05-09 13:45', '2022-05-09 13:51', '2022-05-09 17:00', '2022-05-10 15:25', '2022-05-10 17:18', '2022-05-11 14:00')) # 定义窗口时长(可修改为任意小时数,示例为48小时) window_hours <- 48 # 计算目标列 result <- df %>% mutate( lag_window = date_time - hours(window_hours), # 对应示例中的lag_48hours count = map_dbl(date_time, ~ sum(between(df$date_time, .x - hours(window_hours), .x))) ) # 输出结果 result
方法二:用slider包高效计算(适合大数据集)
如果数据量较大,逐行计算效率偏低,slider包的时间滚动窗口函数能更高效地处理这类需求,且无需手动遍历每一行。
library(slider) # 先确保时间列有序(若原始数据无序,需先排序) df_sorted <- df %>% arrange(date_time) # 计算目标列 result_slider <- df_sorted %>% mutate( lag_window = date_time - hours(window_hours), count = slide_index_dbl( .x = date_time, .i = date_time, .f = ~ length(.x), .before = hours(window_hours) ) ) # 输出结果 result_slider
结果匹配验证
两种方法生成的count列完全符合你的期望:
- id=1时,窗口内仅自身,count=1
- id=2时,窗口包含id=1和自身,count=2
- id=3时,窗口包含id=1、2、3,count=3
- 后续记录的count值也与示例中的期望结果完全一致
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

