I have data table DT with time series, flag and different grouping tables (category, brand, size, etc.)
I want to apply min function grouped by category (configurable) in a moving window size 4 (configurable), ordered by date, If all flags in this window is FALSE, than I need to find minimum value in this window and mark it as TRUE. What is the data.table way to do that and not to use a lot of for loops?
Original table
zz <- "index    date    value   category    flag
1   01.01.2018  20  green   FALSE
2   01.01.2018  8   RED FALSE
3   02.01.2018  21  green   FALSE
4   02.01.2018  5   RED FALSE
5   03.01.2018  19  green   FALSE
6   03.01.2018  5   RED TRUE
7   04.01.2018  17  green   FALSE
8   04.01.2018  7   RED FALSE
9   05.01.2018  19  green   FALSE
10  05.01.2018  8   RED FALSE
11  06.01.2018  18  green   FALSE
12  06.01.2018  8   RED FALSE
13  07.01.2018  17  green   FALSE
14  07.01.2018  8   RED FALSE
15  08.01.2018  16  green   TRUE
16  08.01.2018  4   RED TRUE
17  09.01.2018  15  green   TRUE
18  09.01.2018  4   RED FALSE
19  10.01.2018  14  green   TRUE
20  10.01.2018  6   RED FALSE
21  11.01.2018  13  green   TRUE
22  11.01.2018  8   RED FALSE
23  12.01.2018  14  green   FALSE
24  12.01.2018  9   RED FALSE
25  13.01.2018  13  green   TRUE
26  13.01.2018  5   RED TRUE
27  14.01.2018  14  green   FALSE
28  14.01.2018  6   RED FALSE
29  15.01.2018  12  green   TRUE
30  15.01.2018  4   RED FALSE
31  16.01.2018  14  green   FALSE
32  16.01.2018  4   RED TRUE
33  17.01.2018  13  green   TRUE
34  17.01.2018  2   RED TRUE"
Data <- read.table(text=zz, header = TRUE)
Expected result:
index   date    value   category    flag
1   01.01.2018  20  green   FALSE
2   01.01.2018  8   RED FALSE
3   02.01.2018  21  green   FALSE
4   02.01.2018  5   RED FALSE
5   03.01.2018  19  green   FALSE
6   03.01.2018  5   RED TRUE
7   04.01.2018  17  green   TRUE #marked
8   04.01.2018  7   RED TRUE #marked
9   05.01.2018  19  green   FALSE
10  05.01.2018  8   RED FALSE
11  06.01.2018  18  green   FALSE
12  06.01.2018  8   RED FALSE
13  07.01.2018  17  green   FALSE
14  07.01.2018  8   RED FALSE
15  08.01.2018  16  green   TRUE
16  08.01.2018  4   RED TRUE
17  09.01.2018  15  green   TRUE
18  09.01.2018  4   RED TRUE #marked
19  10.01.2018  14  green   TRUE
20  10.01.2018  6   RED FALSE
21  11.01.2018  13  green   TRUE
22  11.01.2018  8   RED FALSE
23  12.01.2018  14  green   FALSE
24  12.01.2018  9   RED FALSE
25  13.01.2018  13  green   TRUE
26  13.01.2018  5   RED TRUE
27  14.01.2018  14  green   FALSE
28  14.01.2018  6   RED FALSE
29  15.01.2018  12  green   TRUE
30  15.01.2018  4   RED FALSE
31  16.01.2018  14  green   FALSE
32  16.01.2018  4   RED TRUE
33  17.01.2018  13  green   TRUE
34  17.01.2018  2   RED TRUE
 
    