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