查找值超过特定阈值至少 X 时间段的开始和结束日期

Find start and end date of when value exceeds a certain threshold for at least X time periods

我有三列,其中一列包含统计信息,另一列包含临界值,最后一列包含日期。我想知道如何找到超过临界值阈值至少 n 个周期的开始和结束日期。数据简单示例如下:

Date        Statistic  Critical Value
2003-01-01  1.1        0.80
2003-01-08  1.5        0.90
2003-01-15  2.1        0.91
2003-01-22  0.5        0.95
2003-01-29  1.4        0.98
2003-02-05  1.3        1.00
2003-02-12  0.8        1.10

我希望最小周期为 3 的输出为:

Start      End
2003-01-01 2003-01-15

但是,如果最短周期是 2 个而不是 3 个,我预计:

Start      End
2003-01-01 2003-01-15
2003-01-29 2003-02-05

data.table 的一个非常不言自明的解决方案是: (可能会有更紧凑的解决方案)

require(data.table)
setDT(DT)
DT[,exceeds:=Statistic>CriticalValue]
DT[,mydiff := c(0,diff(exceeds))]
DT[mydiff<0, mydiff := 0]
DT[,run := cumsum(mydiff)]
DT[c(exceeds),.(start=Date[1], end = Date[.N], length = .N), by=run]

结果:

   run      start        end length
1:   0 2003-01-01 2003-01-15      3
2:   1 2003-01-29 2003-02-05      2

因此,如果您只想使用 length>2 运行,请使用

DT_agg <- DT[c(exceeds),.(start=Date[1], end = Date[.N], length = .N), by=run]
DT_agg[length>2]

   run      start        end length
1:   0 2003-01-01 2003-01-15      3