Вероятно, есть гораздо лучший и элегантный способ сделать это, но здесь возможное решение.
Начиная с формата даты в столбце даты, вы можете разделить его по месяцам и годам, используя функции month
и year
из пакета lubridate
.
Затем к каждому месяцу и году добавьте 01, чтобы создать первую дату каждого месяца. Затем вы можете сгруппировать по этой дате и выбрать максимальную дату каждой группы, которая соответствует последней дате каждого месяца.
library(lubridate)
df %>% mutate(Month = month(date), Year = year(date)) %>%
mutate(Ini_date = ymd(paste(Year, Month, "01", sep = "-"))) %>%
group_by(Ini_date) %>%
filter(date == max(date))
# A tibble: 61 x 6
# Groups: Ini_date [61]
date t Value Month Year Ini_date
<date> <int> <dbl> <dbl> <dbl> <date>
1 2015-03-31 16 -0.0729 3 2015 2015-03-01
2 2015-04-30 46 2.09 4 2015 2015-04-01
3 2015-05-31 77 -0.611 5 2015 2015-05-01
4 2015-06-30 107 -1.36 6 2015 2015-06-01
5 2015-07-31 138 1.44 7 2015 2015-07-01
6 2015-08-31 169 -1.09 8 2015 2015-08-01
7 2015-09-30 199 -0.152 9 2015 2015-09-01
8 2015-10-31 230 1.04 10 2015 2015-10-01
9 2015-11-30 260 -0.494 11 2015 2015-11-01
10 2015-12-31 291 -0.703 12 2015 2015-12-01
# … with 51 more rows
Это ответит на ваш вопрос?
Воспроизводимый пример
date <- seq(ymd("2015-03-16"), ymd("2020-03-13"), by = "day")
df <- data.frame(date = date,
t = 1:1825,
Value = rnorm(1825))