Сжатие диапазона дат с использованием padr, где начальное значение совпадает с одной из дат во фрейме данных - PullRequest
1 голос
/ 16 апреля 2020

Я не совсем уверен, является ли это ошибкой или я действительно что-то делаю не так. Но я задам вопрос здесь и go оттуда.

Предположим, у нас есть фиктивный набор данных о количестве вызовов:

df_calls = data.frame(Call_date= c("2019-02-18",
                                    "2019-02-19",                                               
                                    "2019-02-20",                                               
                                    "2019-02-22",                                              
                                    "2019-02-25",                                              
                                    "2019-02-26",                                              
                                    "2019-03-01",                                              
                                    "2019-03-04"),
                      Calls = c(12,4,2,8,1,3,1,8))

Я хочу теперь сгущать этот набор данных и посмотрите, сколько звонков было в неделю начиная с с "2019-02-18".

Таким образом, мы имеем:

starting_day= as.Date("2019-02-18")

Теперь я ожидаю, что в неделю, начиная со дня "2019-02-18" до дня "2019-02-24" должны быть 12+4+2+8 = 26 звонки.

Давайте посмотрим ...

Используя библиотеку padr, я использую функцию thicken:

library(padr)

df_calls_weekly = df_calls %>%
                   mutate(Call_date = as.Date(Call_date)) %>% 
                   thicken("week",colname = "Date_Week" ,start_val = starting_day) %>%
                   group_by(Date_Week) %>%  
                   summarise(Num_calls = sum(Calls)) %>%
                   ungroup()

Глядя на df_calls_weekly мы имеем следующий вывод:

    # A tibble: 3 x 2
      Date_Week  Num_calls
      <date>         <dbl>
    1 2019-02-18        14
    2 2019-02-25         5
    3 2019-03-04         8

Мы, кажется, получаем другой ответ, то есть для недели, начиная с "2019-02-18", мы получаем 14 вызовов. Не 26?

После исследования я вижу, что, глядя на то, как thicken создает фрейм данных, кажется, что он отбрасывает строку, где Call_date == "2019-02-18". Что вы можете увидеть здесь явно:

df_calls_weekly = df_calls %>%
  mutate(Call_date = as.Date(Call_date)) %>% 
  thicken("week",colname = "Date_Week" ,start_val = starting_day) %>%
  filter(Date_Week ==starting_day )

с выводом:

   Call_date Calls  Date_Week
1 2019-02-19     4 2019-02-18
2 2019-02-20     2 2019-02-18
3 2019-02-22     8 2019-02-18

по любой причине игнорирует Call_date из "2019-02-18". Я предполагаю, что это связано с тем, что дата вызова совпадает с датой start_val, указанной в функции thicken.

Если кто-нибудь знает, как заставить сгущение включить любой даты, которые совпадают с параметром начальной даты в thicken, я был бы очень признателен.

1 Ответ

2 голосов
/ 16 апреля 2020

Аргумент start_val для thicken:

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

Функция, предполагающая, что все остальные значения строго больше start_val, но у вас самые низкие значения , равные start_val и поэтому эти самые низкие значения игнорируются.

Вот исправление:

df_calls = data.frame(Call_date= c("2019-02-18",
                                   "2019-02-19",                                               
                                   "2019-02-20",                                               
                                   "2019-02-22",                                              
                                   "2019-02-25",                                              
                                   "2019-02-26",                                              
                                   "2019-03-01",                                              
                                   "2019-03-04"),
                      Calls = c(12,4,2,8,1,3,1,8))

starting_day= as.POSIXct("2019-02-17 23:59:59") # a second before the minimum date
library(tidyverse)
library(padr)

df_calls_weekly = df_calls %>%
  mutate(Call_date = as.Date(Call_date)) %>% 
  thicken("week",colname = "Date_Week", start_val = starting_day) %>% 
  group_by(Date_Week) %>%  
  summarise(Num_calls = sum(Calls)) %>%
  ungroup() %>%
  mutate(Date_Week = Date_Week + 1) # add the missing second back in
...