Как назначить значения дня в году, начиная с произвольной даты, и позаботиться о пропущенных значениях? - PullRequest
0 голосов
/ 18 января 2019

У меня есть кадр данных R df_demand со столбцом даты (depdate) и столбцом зависимой переменной bookings. Продолжительность составляет 365 дней, начиная с 2017-11-02 и заканчивая 2018-11-01, отсортированные по возрастанию.

We have booking data for only 279 days in the year.

dplyr::arrange(df_demand, depdate)

           depdate bookings
    1   2017-11-02       43
    2   2017-11-03       27
    3   2017-11-05       27
    4   2017-11-06       22
    5   2017-11-07       39
    6   2017-11-08       48
    .
    .

   279  2018-11-01       60

Я хочу ввести еще один столбец day_of_year следующим образом:

    depdate       day_of_year     bookings
1    2017-11-02        1              43
2    2017-11-03        2              27
3    2017-11-04        3              NA
4    2017-11-05        4              27
    .
    .
    .
365  2018-11-01      365              60

Я пытаюсь найти наилучший способ сделать это.

В Python я мог бы использовать что-то вроде:

df_demand['day_of_year'] = df_demand['depdate'].sub(df_demand['depdate'].iat[0]).dt.days + 1

Я хотел узнать о R equivalent того же самого.

Когда я бегу

typeof(df_demand_2$depdate)

вывод

"double"

Я что-то упустил?

enter image description here

1 Ответ

0 голосов
/ 18 января 2019

Вы можете создать строку для каждой даты, используя функцию complete из пакета tidyr.

Сначала я создаю фрейм данных с некоторыми примерами данных:

df <- data.frame(
  depdate = as.Date(c('2017-11-02', '2017-11-03', '2017-11-05')),
  bookings = c(43, 27, 27)
)

Далее я выполняю две операции.Во-первых, используя tidyr::complete, я указываю все даты, которые я хочу в моем анализе.Я могу сделать это, используя seq.Date, создавая последовательность от первого до последнего дня.

Как только это будет сделано, столбец day_of_year будет просто равен номеру строки.

df_complete <- tidyr::complete(df,
  depdate = seq.Date(from = min(df$depdate), to = max(df$depdate), by = 1)
)

df_complete$day_of_year <- 1:nrow(df_complete)

> df_complete
#> # A tibble: 4 x 3
#>   depdate    bookings day_of_year
#>   <date>        <dbl>       <int>
#> 1 2017-11-02       43           1
#> 2 2017-11-03       27           2
#> 3 2017-11-04       NA           3
#> 4 2017-11-05       27           4

Эквивалентное решение с оператором трубы из dplyr:

df %>%
  complete(depdate = seq.Date(from = min(df$depdate), to = max(df$depdate), by = 1)) %>%
  mutate(days_of_year = row_number())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...