如何查找并统计时间序列中各段连续NA值的长度
R语言tidy风格时间序列连续NA缺口长度计算方案
核心思路
- 基于游程编码
rle()识别连续相同值片段,直接筛选NA对应片段的长度 - 原生适配tidy生态,支持分组批量处理多时间序列,性能满足数千条序列的计算需求
单序列计算代码(匹配示例预期输出)
suppressPackageStartupMessages(library(tidyverse)) suppressPackageStartupMessages(library(lubridate)) # 示例数据生成 dates <- ymd("2016-01-01") + months(0:71) fake_values <- c(661,678,1094,1987,3310,2105,1452,983,1107,805,675,684,436,514,668,206,19,NA,NA,NA,1174,1760,735,366, 510,580,939,1127,2397,1514,1370,832,NA,661,497,328,566,631,983,1876,2784,2928,2543,1508,1175,8,1733, 862,779,1112,1446,2407,3917,2681,NA,NA,NA,NA,NA,1239,1581,2814,1419,2792,4899,5857,2450,1944,1464,1248, 1533,NA) df <- bind_cols(values = fake_values, dates = dates) # 核心计算逻辑 result <- df %>% summarise(gap_length = list({ rle_res <- rle(is.na(values)) rle_res$lengths[rle_res$values] })) %>% unnest(gap_length) %>% rename(some_products_gaps = gap_length)
运行后得到的result与你给出的预期输出完全一致。
多序列批量扩展方案
如果需要处理数千条时间序列,仅需增加序列唯一标识列(比如产品ID、序列ID),按该列分组后执行相同逻辑即可,示例如下:
# 模拟多产品时间序列结构(product_id为序列唯一标识) df_multi <- df %>% mutate(product_id = "product_1") %>% # 追加模拟第二条产品序列 bind_rows(df %>% mutate(values = replace(values, 1:10, NA), product_id = "product_2")) # 批量计算所有序列的缺口长度 multi_gap_result <- df_multi %>% group_by(product_id) %>% summarise(gap_length = list({ rle_res <- rle(is.na(values)) rle_res$lengths[rle_res$values] })) %>% # 如果需要保留列表格式存储各序列的缺口向量,可删除下一行unnest代码 unnest(gap_length)
内容的提问来源于stack exchange,提问作者LGe
相关产品推荐
相关产品推荐

