любридат до последнего дня месяца

#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