Одно решение с tidyversere
и zoo
будет следующим. Вы можете использовать rollapply
, чтобы найти 5 температур ниже нуля, установив их как TRUE
. Как скользящее окно, оно будет отмечать те даты, за которыми следуют четыре дополнительные (последовательные) даты с температурой ниже нуля. Чтобы отфильтровать даты, когда происходят эти серии, посмотрите на переход от FALSE к TRUE.
Редактировать : Если у вас есть несколько столбцов температур, и вы хотите применить этот подход к каждому столбцу температур, вы можете сначала использовать pivot_longer
и group_by
. Пример теперь включает 3 столбца температур.
set.seed(126)
library(tidyverse)
library(zoo)
df %>%
pivot_longer(cols = -date, names_to = "temp", values_to = "value") %>%
group_by(temp) %>%
mutate(start = rollapply(value < 0, width = 5, all, align = "left", fill = FALSE)) %>%
dplyr::filter(start & !lag(start, default = FALSE)) %>%
dplyr::select(date, temp) %>%
arrange(temp, date)
Выход
# A tibble: 7 x 2
# Groups: temp [3]
date temp
<date> <chr>
1 2020-01-10 temp_A
2 2020-01-16 temp_A
3 2020-01-22 temp_A
4 2020-01-05 temp_B
5 2020-01-22 temp_B
6 2020-01-01 temp_C
7 2020-01-23 temp_C
Данные
df <- data.frame(
date = seq(as.Date("2020/01/01"), as.Date("2020/02/01"), "days"),
temp_A = sample(c(-10:2), 32, replace = TRUE),
temp_B = sample(c(-10:2), 32, replace = TRUE),
temp_C = sample(c(-10:2), 32, replace = TRUE)
)
date temp_A temp_B temp_C
1 2020-01-01 -9 -8 -6
2 2020-01-02 -1 1 -9
3 2020-01-03 -6 -7 -4
4 2020-01-04 0 1 -9
5 2020-01-05 2 -8 -3
6 2020-01-06 -4 -3 0
7 2020-01-07 -1 -3 1
8 2020-01-08 2 -3 0
9 2020-01-09 1 -6 1
10 2020-01-10 -1 -7 -1
11 2020-01-11 -2 -4 -6
12 2020-01-12 -8 -2 1
13 2020-01-13 -7 1 -5
14 2020-01-14 -3 -2 -7
15 2020-01-15 0 0 -8
16 2020-01-16 -1 -4 -10
17 2020-01-17 -4 -1 2
18 2020-01-18 -6 1 -9
19 2020-01-19 -5 -7 -5
20 2020-01-20 -4 -6 0
21 2020-01-21 2 0 -6
22 2020-01-22 -1 -3 0
23 2020-01-23 -4 -7 -3
24 2020-01-24 -2 -7 -5
25 2020-01-25 -10 -1 -10
26 2020-01-26 -5 -6 -6
27 2020-01-27 -3 -10 -1
28 2020-01-28 -8 -5 1
29 2020-01-29 0 1 -2
30 2020-01-30 2 -9 -6
31 2020-01-31 -10 -4 -1
32 2020-02-01 2 -10 -4