Как создать серию дат на конец месяца, используя полную функцию? - PullRequest
0 голосов
/ 13 февраля 2020

Вот мой игрушечный набор данных:

df <- tibble::tribble(
         ~date, ~value,
   "2007-01-31",     25,
   "2007-05-31",     31,
   "2007-12-31",     26
  )

Я создаю серию дат на конец месяца, используя следующий код.

df %>% 
  mutate(date = as.Date(date)) %>%
  complete(date = seq(as.Date("2007-01-31"), as.Date("2019-12-31"), by="month"))

Однако я не получаю правильные даты окончания месяца.

  date       value
   <date>     <dbl>
 1 2007-01-31    25
 2 2007-03-03    NA
 3 2007-03-31    NA
 4 2007-05-01    NA
 5 2007-05-31    31
 6 2007-07-01    NA
 7 2007-07-31    NA
 8 2007-08-31    NA
 9 2007-10-01    NA
10 2007-10-31    NA
11 2007-12-01    NA
12 2007-12-31    26

Что мне здесь не хватает? Я в порядке, используя другие функции из любого другого пакета.

1 Ответ

1 голос
/ 13 февраля 2020

Нет необходимости в функции complete, вы можете сделать это в базе R.

Поскольку последний день месяца различен для разных месяцев, мы можем создать последовательность дат начала месяца и вычесть 1 день. от него.

seq(as.Date("2007-02-01"), as.Date("2008-01-01"), by="month") - 1
#[1] "2007-01-31" "2007-02-28" "2007-03-31" "2007-04-30" "2007-05-31" "2007-06-30" 
#    "2007-07-31" "2007-08-31" "2007-09-30" "2007-10-31" "2007-11-30" "2007-12-31"

Используя тот же лог c в обновленном фрейме данных, мы можем сделать:

library(dplyr)
df %>% 
  mutate(date = as.Date(date)) %>%
  tidyr::complete(date = seq(min(date) + 1, max(date) + 1, by="month") - 1)

#    date       value
#   <date>     <dbl>
# 1 2007-01-31    25
# 2 2007-02-28    NA
# 3 2007-03-31    NA
# 4 2007-04-30    NA
# 5 2007-05-31    31
# 6 2007-06-30    NA
# 7 2007-07-31    NA
# 8 2007-08-31    NA
# 9 2007-09-30    NA
#10 2007-10-31    NA
#11 2007-11-30    NA
#12 2007-12-31    26
...