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

如何在R中实现滞后周期内的事件频率统计?

问题:计算滞后周期内的连续事件频率

样本数据集

天数count
11
21
31
41
50
60
70
80

需求说明

目标是计算滞后周期内的事件频率,规则为连续3个count=1记为1个事件:

  • 针对指定的滞后值lag_period,某一天的frequency是指:以该天为终点、长度为lag_period的窗口内,所有满足“连续3个count=1”的连续子序列数量。
  • 当天数不足以形成能容纳完整事件的窗口时,frequency记为NA。

示例说明

示例1:滞后值=3

窗口范围为当前天往前推3天(如第4天对应窗口1-4天,第5天对应窗口2-5天):

  • 第3天:窗口仅包含1-3天,其中连续3个count=1,故frequency=1
  • 第4天:窗口1-4天内,包含[1-3]、[2-4]两个连续3个1的子序列,故frequency=2
  • 第5天:窗口2-5天内,仅[2-4]是连续3个1的子序列,[3-5]包含0不计入,故frequency=1

预期结果:

天数countfrequency
11NA
21NA
311
412
501

示例2:滞后值=4

窗口范围为当前天往前推4天(第5天对应窗口1-5天):

  • 第5天:窗口1-5天内,包含[1-3]、[2-4]两个连续3个1的子序列,[3-5]包含0不计入,故frequency=2

预期结果:

天数countfrequency
11NA
21NA
31NA
41NA
502

R语言实现

示例数据

data <- data.frame(Day = 1:8, 
                   count = c(rep(1, 4), rep(0, 4)))

实现函数

calculate_frequency <- function(df, lag_period, event_length = 3) {
  # 找出所有连续event_length个1的起始位置
  event_starts <- which(zoo::rollapply(df$count, width = event_length, FUN = function(x) all(x == 1)))
  
  # 为每个天数计算frequency
  df$frequency <- sapply(df$Day, function(day) {
    window_start <- day - lag_period + 1
    window_end <- day
    
    # 窗口无法容纳完整事件时返回NA
    if (window_start + event_length - 1 > window_end) {
      return(NA)
    }
    
    # 统计窗口内的有效事件数量
    sum(event_starts >= window_start & (event_starts + event_length - 1) <= window_end)
  })
  
  return(df)
}

# 测试滞后值=3的情况
result_lag3 <- calculate_frequency(data, lag_period = 3)
print(result_lag3[, c("Day", "count", "frequency")])

# 测试滞后值=4的情况
result_lag4 <- calculate_frequency(data, lag_period = 4)
print(result_lag4[, c("Day", "count", "frequency")])

代码说明

  1. 用zoo::rollapply滑动遍历count列,标记所有连续3个1的起始索引;
  2. 对每个天数,确定其对应的窗口范围[day - lag_period + 1, day];
  3. 统计窗口内的有效事件数:要求事件的起始位置在窗口内,且事件的结束位置(起始+2)不超过窗口终点;
  4. 当窗口无法容纳完整的3长度序列时,返回NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:10:28