使用R的时间序列中的间隙大小计算

时间:2018-06-25 17:45:55

标签: r time-series

假设我有一个包含以下时间序列的数据框:

Date                value
2000-01-01 00:00:00  4.6
2000-01-01 01:00:00  N/A
2000-01-01 02:00:00  5.3
2000-01-01 03:00:00  6.0
2000-01-01 04:00:00  N/A
2000-01-01 05:00:00  N/A
2000-01-01 06:00:00  N/A
2000-01-01 07:00:00  6.0

我想找到一种有效的方法来计算间隙的大小(连续N / As的数量)并将其添加到数据框的新列中,以得到以下信息:

Date                value  gap_size
2000-01-01 00:00:00  4.6      0
2000-01-01 01:00:00  N/A      1
2000-01-01 02:00:00  5.3      0
2000-01-01 03:00:00  6.0      0
2000-01-01 04:00:00  N/A      3
2000-01-01 05:00:00  N/A      3
2000-01-01 06:00:00  N/A      3
2000-01-01 07:00:00  6.0      0

我的数据框实际上有超过600万行,因此我正在寻找计算方面最便宜的方法。请注意,我的时间序列在整个数据集中是等距的(1小时)。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可以尝试使用rle来生成行程长度。首先,使用is.na将您的value列转换为逻辑并应用rle,它提供输入向量不同值的游程长度。在这种情况下,这两个类别为TRUE和FALSE,您需要计算它们的运行时间。然后,您可以rep按照游程长度对其进行分组,以获得所需的输出。

x = c(1,2,4,NA,NA,6,NA,19,NA,NA)
res = rle(is.na(x))
rep(res$values*res$lengths,res$lengths)
#> [1] 0 0 0 2 2 0 1 0 2 2

答案 1 :(得分:1)

使用setDT()设置为data.table,并且:

dt[, gap := rep(rle(value)$lengths, rle(value)$lengths) * (value == "N/A")]
                  Date value gap
1: 2000-01-01 00:00:00   4.6   0
2: 2000-01-01 01:00:00   N/A   1
3: 2000-01-01 02:00:00   5.3   0
4: 2000-01-01 03:00:00   6.0   0
5: 2000-01-01 04:00:00   N/A   3
6: 2000-01-01 05:00:00   N/A   3
7: 2000-01-01 06:00:00   N/A   3
8: 2000-01-01 07:00:00   6.0   0

数据:

dt <- structure(list(Date = c("2000-01-01 00:00:00", "2000-01-01 01:00:00", 
"2000-01-01 02:00:00", "2000-01-01 03:00:00", "2000-01-01 04:00:00", 
"2000-01-01 05:00:00", "2000-01-01 06:00:00", "2000-01-01 07:00:00"
), value = c("4.6", "N/A", "5.3", "6.0", "N/A", "N/A", "N/A", 
"6.0")), row.names = c(NA, -8L), class = c("data.table", "data.frame"
))