如何通过末尾缺失观察的数量来分隔时间序列面板?

How to separate a time series panel by the number of missing observations at the end?

考虑一组具有相同长度的时间序列。有的最后因为缺货,或者下架导致数据缺失。

如果该系列最后包含至少四个缺失的观察值(在我的例子中是值 = 0 而不是 NA),我认为该系列已除名。

在我的时间序列面板中,我想将具有除名 ID 的系列与其他系列分开,并基于此分离创建两个不同的数据帧。

我创建了一个简单的 reprex 来说明问题:

library(tidyverse)
library(lubridate)

data <- tibble(id = as.factor(c(rep("1",24),rep("2",24))),
               date = rep(c(ymd("2013-01-01")+ months(0:23)),2),
               value = c(c(rep(1,17),0,0,0,0,2,2,3), c(rep(9,20),0,0,0,0))
              )

我正在寻找可通过管道传输的 tidyverse 解决方案。

这是找到已除名 ID 的一种方法

data %>%
  group_by(id) %>%
  mutate(delisted = all(value[(n()- 3):n()] == 0)) %>%
  group_by(delisted) %>%
  group_split()

最后,我使用 group_split 将数据分成两部分:一部分包含已删除的 ID,另一部分包含 non-delisted 个 ID。