为新列中的非连续缺失数据时间段分配标签

Assign label to non-consecutive missing data time periods in new column

我正在努力解决这里的另一个问题:Fill in time series gaps with both LCOF and NOCB methods but acknowledge breaks in time series 它引发了一个新问题。

我有一个缺少数据 (NA) 的时间序列数据集。

    > str(final_daily_intake2)
    'data.frame':   387 obs. of  11 variables:
     $ Date             : chr  "2014-08-13" "2014-08-14" "2014-08-15" "2014-08-16" ...
     $ MEID.1           : chr  NA NA NA "14" ...
     $ MEID.2           : Factor w/ 184 levels "1","100","100.1",..: NA NA NA 143 48 NA NA NA NA NA ...
     $ MEID.3           : Factor w/ 180 levels "100","100.1",..: NA NA NA 24 134 NA NA NA NA NA ...
     $ MEID.4           : Factor w/ 42 levels "173","173a","173b",..: NA NA NA 17 1 NA NA NA NA NA ...
     $ MEID.5           : Factor w/ 3 levels "d1","s1","s2": NA NA NA 2 3 NA NA NA NA NA ...
     $ MEID.6           : Factor w/ 1 level "s2": NA NA NA NA NA NA NA NA NA NA ...
     $ DAYT             : int  NA NA NA 1 8 NA NA NA NA NA ...
     $ DATT             : int  NA NA NA 1 1 NA NA NA NA NA ...
     $ Reason.For.Change: chr  "0" "0" "0" "0" ...
     $ GAP_Days         : chr  "1" "2" "3" "NA" ...

数据上的 head() 给出

       Date MEID.1 MEID.2 MEID.3 MEID.4 MEID.5 MEID.6 DAYT DATT Reason.For.Change GAP_Days
1 2014-08-13   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        1
2 2014-08-14   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        2
3 2014-08-15   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        3
4 2014-08-16     14     61    117    187     s1   <NA>    1    1                 0       NA
5 2014-08-17    14a    193     56    173     s2   <NA>    8    1                 0       NA
6 2014-08-18   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        1

我在 GAP_Days 列中标记了缺失数据时间段内的连续天数。

我想在数据框中创建一个新列来标记缺失的数据时间段。例如,此数据集有 9 个缺失的时间段。新列 GAP_LABEL 将从 1 开始并在 9 结束。例如,在此数据集中的第一个缺失时间段中,前三个日期的 GAP_LABEL 值将为 1,因为它们都属于同一个缺失数据时间段。

预期结果

    Date MEID.1 MEID.2 MEID.3 MEID.4 MEID.5 MEID.6 DAYT DATT Reason.For.Change GAP_Days GAP_LABEL
1 2014-08-13   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        1          1
2 2014-08-14   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        2          1
3 2014-08-15   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        3          1
4 2014-08-16     14     61    117    187     s1   <NA>    1    1                 0       NA
5 2014-08-17    14a    193     56    173     s2   <NA>    8    1                 0       NA
6 2014-08-18   <NA>   <NA>   <NA>   <NA>   <NA>   <NA>   NA   NA                 0        1          2

我还没有看到其他示例来说明如何完成此操作。如果有人有建议,那就太好了。

这样的事情怎么样:

final_daily_intake2 <- within(final_daily_intake2, {
  GAP_LABEL <- GAP_Days
  GAP_LABEL[!is.na(GAP_Days)] <- cumsum(GAP_Days[!is.na(GAP_Days)]==1)
})

这里的关键是cumsum()给出了向量的累加和。通过在 GAP_Days==1 上使用 cumsum(),它允许您在每次开始新计数时递增 1。