R 中通过阈值的滚动窗口

dlo*_*ain 3 r dataframe dplyr

我有这样的数据框:

day         device      delta
2021-01-01  A           1.3
2021-01-02  A           2.56
2021-01-03  A           -1.72
2021-01-04  A           4.09
2021-01-05  A           6.99
2021-01-06  A           3.23
2021-01-07  A           1.12
2021-01-08  A           4.56
2021-01-09  A           1.09
2021-01-10  A           2.14
2021-01-01  B           -0.76
2021-01-02  B           -1.78
2021-01-03  B           1.54
2021-01-04  B           1.93
2021-01-05  B           5.98
2021-01-06  B           2.49
2021-01-07  B           8.92
2021-01-08  B           8.08
2021-01-09  B           3.12
2021-01-10  B           1.88
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种有效的方法可以找出任何设备有多少个 7 天(行)窗口包括窗口中第一行的增量值增加超过 5 个点?

我还需要列出每个窗口的第一个增量值以及通过 5 点阈值的第一个增加值。

期望的结果如下所示:

window_start    window_end    device    delta_first    delta_first_threshold_pass   
2021-01-01      2021-01-07    A         1.3            6.99
2021-01-03      2021-01-09    A         -1.72          6.99
2021-01-01      2021-01-07    B         -0.76          5.98
2021-01-02      2021-01-08    B         -1.78          5.98
2021-01-03      2021-01-09    B         1.54           8.92
2021-01-04      2021-01-10    B         1.93           8.92
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?感谢您的任何建议!

Ben*_*Ben 5

rollapplyr也许你可以从包中使用zoo

分组依据 后device,您可以确定max5 天/行窗口的增量。使用align“left”时,索引左对齐(包括索引日期之后的后续日期)。

然后,您可以对值 和filter之间的差值大于阈值 5 的行进行排序。maxdelta

library(zoo)
library(tidyverse)

df %>%
  group_by(device) %>%
  mutate(max = rollapplyr(delta, width = 5, FUN = max, align = "left", partial = T)) %>%
  filter(max - delta > 5)
Run Code Online (Sandbox Code Playgroud)

输出

  day        device delta   max
  <chr>      <chr>  <dbl> <dbl>
1 2021-01-01 A       1.3   6.99
2 2021-01-03 A      -1.72  6.99
3 2021-01-01 B      -0.76  5.98
4 2021-01-02 B      -1.78  5.98
5 2021-01-03 B       1.54  8.92
6 2021-01-04 B       1.93  8.92
7 2021-01-06 B       2.49  8.92
Run Code Online (Sandbox Code Playgroud)