Отступая вокруг даты в R, чтобы добавить пропущенные / пустые месяцы? - PullRequest
0 голосов
/ 23 октября 2019

padr R pacakge vignette описывает различные функции пакета для заполнения дат и времени вокруг указанных дат и времени.

Я нахожусь в ситуациях, когда я будуподсчет событий во фреймах данных (т. е. dplyr::count()), которые нужно будет наносить на карту событий в течение, скажем, одного года. Когда я подсчитываю события во фрейме данных с небольшим объемом, я часто получаю результаты по отдельным позициям, например:

library(tidyverse)
library(lubridate)
library(padr)
df <- tibble(col1 = as.Date("2018-10-01"), col2 = "g", col3 = 5)

#> # A tibble: 1 x 3
#>   col1       col2   col3
#>   <date>     <chr> <dbl>
#> 1 2018-10-01 g         5

Чтобы составить график с помощью ggplot, в течение года, ежемесячно, требуется фрейм данных из 12 строк. По сути, это должно выглядеть так:

#> # A tibble: 12 x 3
#>   col1       col2   col3
#>   <date>     <chr> <dbl>
#>  1 2018-01-01 NA        0
#>  2 2018-02-01 NA        0
#>  3 2018-03-01 NA        0
#>  4 2018-04-01 NA        0
#>  5 2018-05-01 NA        0
#>  6 2018-06-01 NA        0
#>  7 2018-07-01 NA        0
#>  8 2018-08-01 NA        0
#>  9 2018-09-01 NA        0
#> 10 2018-10-01 g         5
#> 11 2018-11-01 NA        0
#> 12 2018-12-01 NA        0

Возможно, padr() может сделать это с помощью некоторой комбинации функций thicken() и pad(). Мои попытки показаны ниже, ни строка 3, ни строка 4 не создают фрейм данных, показанный непосредственно выше.

Как построить вышеупомянутый фрейм данных, используя padr(), lubridate(), tidyverse(), data.table(), base R или как угодно пожалуйста? Ручной ввод каждого месяца также не рассматривается, если это необходимо сказать. Спасибо.

df %>% 
  thicken("year") %>% 
  # pad(by = "col1") %>%       # line 3
  # pad(by = "col1_year") %>%  # line 4
  print()

1 Ответ

1 голос
/ 23 октября 2019
library(lubridate)
library(tidyverse)

df <- tibble(col1 = as.Date("2018-10-01"), col2 = "g", col3 = 5)

my_year <- year(df$col1[1])

df2 <- tibble(col1 = seq(ymd(paste0(my_year,'-01-01')),ymd(paste0(my_year,'-12-01')), by = '1 month'))

df3 <- merge(df,df2, by ="col1",all.y=TRUE) %>% mutate(col3 = replace_na(col3,0))

df3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...