Я думаю, что вам нужно, чтобы даты, используемые для вырезания, определялись динамически по данным, а не указывались вручную.
Я сгенерирую еще несколько дат, так как трудно тестировать четыре даты ежеквартально, когда они все в одном квартале.
set.seed(2)
( dates <- sort(Sys.Date() + sample(365, size=20)) )
# [1] "2018-06-12" "2018-07-03" "2018-07-17" "2018-07-20" "2018-07-24"
# [6] "2018-08-04" "2018-08-10" "2018-10-07" "2018-10-19" "2018-11-01"
# [11] "2018-11-29" "2018-11-30" "2018-12-12" "2019-01-28" "2019-02-10"
# [16] "2019-03-12" "2019-04-22" "2019-04-23" "2019-05-10" "2019-05-13"
Придумайте даты начала и окончания:
( start <- lubridate::floor_date(min(dates), unit="quarter") )
# [1] "2018-04-01"
( end <- lubridate::ceiling_date(max(dates), unit="quarter") )
# [1] "2019-07-01"
Нас интересуют кварталы:
( brks <- seq(start, end, by="quarter") )
# [1] "2018-04-01" "2018-07-01" "2018-10-01" "2019-01-01" "2019-04-01"
# [6] "2019-07-01"
cut(dates, breaks=brks)
# [1] 2018-04-01 2018-07-01 2018-07-01 2018-07-01 2018-07-01 2018-07-01
# [7] 2018-07-01 2018-10-01 2018-10-01 2018-10-01 2018-10-01 2018-10-01
# [13] 2018-10-01 2019-01-01 2019-01-01 2019-01-01 2019-04-01 2019-04-01
# [19] 2019-04-01 2019-04-01
# Levels: 2018-04-01 2018-07-01 2018-10-01 2019-01-01 2019-04-01
Если вам не нужно выравнивать по календарным кварталам - просто группируйте данные по трем месяцам за раз - тогда вы можете вместо этого сделать:
( start_m <- lubridate::floor_date(min(dates), unit="month") )
# [1] "2018-06-01"
( end_m <- lubridate::ceiling_date(max(dates) + 93L, unit="month") )
# [1] "2019-09-01"
( brks_m <- seq(start_m, end_m, by="quarter") )
# [1] "2018-06-01" "2018-09-01" "2018-12-01" "2019-03-01" "2019-06-01"
# [6] "2019-09-01"
(Магия 93L
заключается в том, чтобы гарантировать, что у нас есть по крайней мере еще один квартал за пределами текущего месяца, что необходимо только потому, что ceiling(month)
может не пойти достаточно далеко, чтобы захватить три месяца из предыдущего нестандартного квартала. Создание слишком большого количества разрывов неплохо, дополнения просто останутся неиспользованными.)