如何测量每个 id 的时间序列面板中的平均间隙大小?

How to measure the average gap size in a time series panel per id?

为了处理产品时间序列,其中很多产品显示出间歇性需求,我想测量序列之间由零值组成的差距有多大。

在下一步中,我想测量每个 ID 的平均间隙长度。在我的示例中,ID 1 为 4.33。

我找到了一个用于测量时间序列间隙大小的旧解决方案,它没有给我结果,我能够进一步处理它并得出诸如平均间隙大小以及最小和最大间隙大小之类的度量:

library(tidyverse)
library(lubridate)
library(data.table)

data <- tibble(id = as.factor(c(rep("1",24),rep("2",24),rep("3",24))),
               date = rep(c(ymd("2013-01-01")+ months(0:23)),3),
               value = c(c(rep(4,5),0,0,0,0,0,0,0,0,7,0,0,0,0,11,23,54,33,45,0),
                         c(4,6,1,2,3,4,4,6,8,11,18,6,6,1,7,7,13,9,4,33,3,6,81,45),
                         c(rep(4,5),0,0,0,5,2,0,0,0,7,0,0,8,0,11,23,54,33,0,0))
)


# this gives me the repeated gap size per observation
setDT(data)
data[, gap := rep(rle(value)$lengths, rle(value)$lengths) * (value == 0)]

# I want the distinct gap size per id 
1: c(8,4,1)
2: c(0)
3: c(3,3,2,1,2)

如果我能够确定每个 id 的间隙数,我还可以通过检索每个 id 的零总数来计算平均间隙大小,如下所示 (13/3 = 4.33):

# total number of zeros per id
data <- as_tibble(data)
data %>% group_by(id) %>% summarise(zero_sum = length(which(value == 0)))

您可以使用 rle:

library(data.table)
setDT(data)
data[,.(n=with(rle(value==0),lengths*values)),by=id][n>0]

       id     n
   <fctr> <int>
1:      1     8
2:      1     4
3:      1     1
4:      3     3
5:      3     3
6:      3     2
7:      3     1
8:      3     2

或预期格式:

data[,.(n=list(with(rle(value==0),{r = lengths*values; 
                                   r <- r[r!=0];
                                   if (length(r)==0) {r <- 0L};
                                   r }))),by=id]

       id         n
   <fctr>    <list>
1:      1     8,4,1
2:      2         0
3:      3 3,3,2,1,2