【问题标题】:Assign label to non-consecutive missing data time periods in new column为新列中不连续的缺失数据时间段分配标签
【发布时间】:2015-11-19 19:11:21
【问题描述】:

我正在努力解决另一个问题: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

我还没有看到其他示例来说明如何做到这一点。如果有人有建议,那就太好了。

【问题讨论】:

    标签: r dataframe missing-data


    【解决方案1】:

    这样的事情怎么样:

    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。

    【讨论】:

    • 我的问题是 GAP_LABEL 不存在,我想创建它。 (请参阅上面的编辑以包括我的预期结果)。
    • 那是粗心的。我本来打算使用GAP_Days 进行计算。已更新。
    • 谢谢。这是非常接近的。这适当地将同一时间段内的 GAP_Days 标记为相同的值,但它也标记了后续的 NA 天,这些天是非缺失的,因此不是 GAP 的一部分。例如,数据集中的前两个非 NA 行的 GAP_LABEL 也为 1。我将继续接受这个答案,因为它让我可以创建一个条件列,当数据时接受来自 GAP_LABEL 的值在其他列中为 NA。非常感谢您的帮助。
    • 好的。使用 !is.na(GAP_Days) 应该可以让它单独留下非 NA 值(它们最终应该是 NAin GAP_LABEL)。我想知道出了什么问题。
    猜你喜欢
    • 2015-12-18
    • 2023-03-08
    • 1970-01-01
    • 2020-08-19
    • 2017-08-26
    • 2021-11-16
    • 2014-01-17
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多