如何在R中实现滞后周期内的事件频率统计?
问题:计算滞后周期内的连续事件频率
样本数据集
| 天数 | count |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 5 | 0 |
| 6 | 0 |
| 7 | 0 |
| 8 | 0 |
需求说明
目标是计算滞后周期内的事件频率,规则为连续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
预期结果:
| 天数 | count | frequency |
|---|---|---|
| 1 | 1 | NA |
| 2 | 1 | NA |
| 3 | 1 | 1 |
| 4 | 1 | 2 |
| 5 | 0 | 1 |
示例2:滞后值=4
窗口范围为当前天往前推4天(第5天对应窗口1-5天):
- 第5天:窗口1-5天内,包含[1-3]、[2-4]两个连续3个1的子序列,[3-5]包含0不计入,故
frequency=2
预期结果:
| 天数 | count | frequency |
|---|---|---|
| 1 | 1 | NA |
| 2 | 1 | NA |
| 3 | 1 | NA |
| 4 | 1 | NA |
| 5 | 0 | 2 |
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")])
代码说明
- 用
zoo::rollapply滑动遍历count列,标记所有连续3个1的起始索引; - 对每个天数,确定其对应的窗口范围
[day - lag_period + 1, day]; - 统计窗口内的有效事件数:要求事件的起始位置在窗口内,且事件的结束位置(起始+2)不超过窗口终点;
- 当窗口无法容纳完整的3长度序列时,返回
NA。
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

