Как создавать снимки вовремя с помощью R - PullRequest
1 голос
/ 21 октября 2019
library(tidyverse)

df <- tibble(`Action Item ID` = c("ABC", "EFG", "HIJ", "KLM", "NOP", "QRS"),
             `Date Created` = as.Date(c("2019-01-01", "2019-01-01", 
                                        "2019-06-01", "2019-06-01",
                                        "2019-08-01", "2019-08-01")),
             `Date Closed` = as.Date(c("2019-01-15", "2019-05-31", 
                                        "2019-06-15", "2019-07-05",
                                        "2019-08-15", NA)),
             `Current Status` = c(rep("Closed", 5), "Open"))

#> # A tibble: 6 x 4
#>   `Action Item ID` `Date Created` `Date Closed` `Current Status`
#>   <chr>            <date>         <date>        <chr>           
#> 1 ABC              2019-01-01     2019-01-15    Closed          
#> 2 EFG              2019-01-01     2019-05-20    Closed          
#> 3 HIJ              2019-06-01     2019-06-15    Closed          
#> 4 KLM              2019-06-01     2019-07-05    Closed          
#> 5 NOP              2019-08-01     2019-08-15    Closed          
#> 6 QRS              2019-08-01     NA            Open  

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

В последний день января в полночь (мой первый снимок во времени):

  • Элемент действия ABC был закрыт,который соответствует его текущему состоянию на сегодня.
  • Действие Элемент EFG был Открыт, однако теперь он закрыт с правильным значением Current Status == "Closed" на сегодняшний день. Но я хочу знать, что он был открыт еще 31 января, и иметь возможность подсчитывать все такие случаи.
  • Я также хочу видеть, что в течение следующих нескольких месяцев этот элемент действия оставался открытым и должен постоянносчитать до закрытия

Кажется, легче сказать, чем сделать. Возможно, я просто неопытный. Что такое «магический код», который я могу написать ниже, который будет:

  1. Обрезать все месяцы из моего фрейма данных, чтобы считать в порядке, показанном ниже.
  2. Заполните пропущенные месяцы,даже если их нет в моем фрейме данных, т. е. tidyr::complete, с соответствующими значениями (даже 0 при необходимости).
  3. Постоянно считайте открытые элементы действия месяц за месяцем, пока они не будут закрыты

Вот результаты «Магического кода», выполненного мной вручную. Обратите внимание, что все должно быть автоматизировано, я не могу вручную менять названия месяцев месяц за месяцем. Спасибо.

df.months <- "Magic Code"

#> # A tibble: 6 x 4
#> `Month`       `Action Item Qty Open at End of Month` 
#> <date>         <integer>    
#> 2019-01-01     1
#> 2019-02-01     1
#> 2019-03-01     1
#> 2019-04-01     1
#> 2019-05-01     0
#> 2019-06-01     1
#> 2019-07-01     0
#> 2019-08-01     1

1 Ответ

1 голос
/ 21 октября 2019

Вот один из подходов. Сначала измените форму, чтобы увеличить форму, затем считайте Созданный как добавляющий один и Закрытый как уменьшающийся. Затем подсчитайте месячные суммы этих приращений и заполните пропущенные месяцы.

df %>%
  # convert to longer form, with one row for each Created or Closed
  pivot_longer(-c(`Action Item ID`, `Current Status`), "type", "date") %>%
  mutate(change = if_else(type == "Date Created", 1, -1)) %>%
  mutate(month = lubridate::floor_date(value, "month")) %>%
  arrange(value) %>%
  # get the sum of "change" for each month. Equivalent to:
  #    group_by(month) %>% summarize(n = sum(change) %>%
  count(month, wt = change) %>%
  # Add rows for any missing months in the series and replace NAs with 0's
  padr::pad() %>%
  replace_na(list(n=0)) %>%
  # Track cumulative change across all months to date
  mutate("Open at end of month" = cumsum(n))


## A tibble: 9 x 3
#  month          n `Open at end of month`
#  <date>     <dbl>                  <dbl>
#1 2019-01-01     1                      1
#2 2019-02-01     0                      1
#3 2019-03-01     0                      1
#4 2019-04-01     0                      1
#5 2019-05-01    -1                      0
#6 2019-06-01     1                      1
#7 2019-07-01    -1                      0
#8 2019-08-01     1                      1
#9 NA            -1                      0
...