#r #tidyverse #lubridate
Вопрос:
library(dplyr)
library(lubridate)
У меня есть такие данные
f <- tribble(~a, ~date,
"BVH", 201801,
"HBYU", 202012,
"CYC", 202112,
"AC", 202109)
И мне нужно преобразовать его в последний день месяца, я делаю это
f %>% mutate(date = ym(date))
# A tibble: 4 x 2
a date
<chr> <date>
1 BVH 2018-01-01
2 HBYU 2020-12-01
3 CYC 2021-12-01
4 AC 2021-09-01
Чего бы мне хотелось, так это
# A tibble: 4 x 2
a date
<chr> <date>
1 BVH 2018-01-31
2 HBYU 2020-12-31
3 CYC 2021-12-31
4 AC 2021-09-30
Ответ №1:
lubridate rollforward
делает именно то, что вы хотите:
> f %>% mutate(date = rollforward(ym(date)))
# A tibble: 4 x 2
a date
<chr> <date>
1 BVH 2018-01-31
2 HBYU 2020-12-31
3 CYC 2021-12-31
4 AC 2021-09-30
Ответ №2:
Вот два других подхода —
library(dplyr)
library(lubridate)
f %>%
mutate(date = ym(date),
date1 = date months(1) - 1,
date2 = ceiling_date(date, 'month') - 1)
# a date date1 date2
# <chr> <date> <date> <date>
#1 BVH 2018-01-01 2018-01-31 2018-01-31
#2 HBYU 2020-12-01 2020-12-31 2020-12-31
#3 CYC 2021-12-01 2021-12-31 2021-12-31
#4 AC 2021-09-01 2021-09-30 2021-09-30