基于R的时间序列间隙大小计算

基于R的时间序列间隙大小计算,r,time-series,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

假设我有一个包含时间序列的数据帧,如下所示:

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/a的数量),并将其添加到我的数据帧的新列中,以获得以下结果:

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小时)。

在本例中,您可以尝试使用
rle
生成运行长度。首先,使用
is.na
将值列转换为逻辑列,并应用
rle
,它提供输入向量不同值的运行长度。在本例中,这两个类别是对的和错的,您要计算它们的运行时间。然后,您可以
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

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

数据:


你已经试过什么了?我还没试过。我唯一想做的就是在数据帧中循环,我想避免这种情况。太棒了。正是我需要的。谢谢我如何调整此代码以处理多个站点?例如,如果我有多个站点的时间序列,并且想知道每个站点的最大差距是多少@sindri_Baldur您可以使用
by
参数。
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"
))