为新列中的非连续缺失数据时间段分配标签
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。
我正在努力解决这里的另一个问题: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。