如何在时间序列中查找和描述连续的 NA 值?
How to find and describe consecutive NA-values in a time series?
为了按特定标准对时间序列进行聚类,我想测量序列内部间隙的长度。这些差距可能表明存在各种业务问题,有经验的分析师应该先查看这些差距,然后再将这些值输送到预测模型中。我知道如何识别、计算和替换 NA。那不是我想在这里做的。
相反,我想将每个连续的(也是单个的)NA 值的长度识别为每个时间序列的向量。
一些代码来说明我的问题和想要的结果:
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(fake_values, dates) %>%
rename(c(values = ...1, dates = ...2)
)
# resulting vector('s)
result <- as.data.frame(c(3,1,5,1))
names(result)[1] = "some_products_gaps"
顺便说一句,我更喜欢整洁的解决方案。希望我不是希望太多...解决方案必须是可扩展的,因为我需要 loop/apply 它用于数千个时间序列。提前致谢!
应该这样做
x = is.na(df$values)
rle(x)$lengths[rle(x)$values]
在 data.table
rleid
的帮助下,这里有一个 dplyr
解决方案。
library(dplyr)
df %>%
mutate(grp = data.table::rleid(is.na(values))) %>%
filter(is.na(values)) %>%
count(grp, name = 'some_products_gaps') %>%
select(-grp)
# some_products_gaps
# <int>
#1 3
#2 1
#3 5
#4 1
为了按特定标准对时间序列进行聚类,我想测量序列内部间隙的长度。这些差距可能表明存在各种业务问题,有经验的分析师应该先查看这些差距,然后再将这些值输送到预测模型中。我知道如何识别、计算和替换 NA。那不是我想在这里做的。 相反,我想将每个连续的(也是单个的)NA 值的长度识别为每个时间序列的向量。
一些代码来说明我的问题和想要的结果:
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(fake_values, dates) %>%
rename(c(values = ...1, dates = ...2)
)
# resulting vector('s)
result <- as.data.frame(c(3,1,5,1))
names(result)[1] = "some_products_gaps"
顺便说一句,我更喜欢整洁的解决方案。希望我不是希望太多...解决方案必须是可扩展的,因为我需要 loop/apply 它用于数千个时间序列。提前致谢!
应该这样做
x = is.na(df$values)
rle(x)$lengths[rle(x)$values]
在 data.table
rleid
的帮助下,这里有一个 dplyr
解决方案。
library(dplyr)
df %>%
mutate(grp = data.table::rleid(is.na(values))) %>%
filter(is.na(values)) %>%
count(grp, name = 'some_products_gaps') %>%
select(-grp)
# some_products_gaps
# <int>
#1 3
#2 1
#3 5
#4 1