Как создать представление воронки в R

#r #dataframe #dplyr #tidyverse #tidyr

Вопрос:

У меня есть фрейм данных, который имеет следующую структуру.

 ProdID         Date                    class          price        set
PD-10011       2021-05-01 10:12:16     Regular        1000         ZR
PD-10712       2021-05-02 18:12:06     Premium        1000         ZR
PD-10213       2021-05-02 16:02:59     Premium        1000         ZR
PD-10814       2021-05-03 17:12:06     Premium        1000         RS
PD-10315       2021-05-04 19:10:11     Other          1000         RR
PD-10616       2021-05-04 13:18:14     Expired        1000         ZR
PD-10617       2021-05-04 15:14:19     Regular        1000         ZR
 

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

Май-21, месяц должен автоматически заполняться в зависимости от даты. Если есть записи за несколько месяцев, то они должны быть упорядочены по месяцам в порядке убывания месяца. Здесь Total указано общее количество уникальных продидов за этот конкретный месяц. Regular это количество и сумма тех продидов, которые имеют класс «Обычный» и аналогичную логику для строки «Премиум». miscellaneous Строка-это количество продидов, имеющих классы, отличные от «Обычных» и «Премиум». RS (Premium) это количество и сумма тех, где класс «Премиум», а также указан как «RS».

 May-21           Count of ProdID       Percentage Count       Sum of Price        Percentage Sum
Total            7                     100.00%                7000                100.00%
Regular          2                     28.57%                 2000                28.57%
Premium          3                     42.85%                 3000                42.85%
miscellaneous    2                     28.57%                 2000                28.57%
RS (Premium)     1                     33.33%                 1000                33.33%  

         
 

Комментарии:

1. вы должны сосредоточить свой вопрос только на одной проблеме.

Ответ №1:

В StackOverflow ожидается, что вы покажете свои собственные попытки решить проблему. Сказав это, вы должны начать с этого:

 library(tidyverse)
library(lubridate)
library(janitor)

df <- tibble::tribble(
                                      ~ProdID,                 ~Date,    ~class, ~price, ~set,
                                   "PD-10011", "2021-05-01 10:12:16", "Regular",  1000L, "ZR",
                                   "PD-10712", "2021-05-02 18:12:06", "Premium",  1000L, "ZR",
                                   "PD-10213", "2021-05-02 16:02:59", "Premium",  1000L, "ZR",
                                   "PD-10814", "2021-05-03 17:12:06", "Premium",  1000L, "RS",
                                   "PD-10315", "2021-05-04 19:10:11",   "Other",  1000L, "RR",
                                   "PD-10616", "2021-05-04 13:18:14", "Expired",  1000L, "ZR",
                                   "PD-10617", "2021-05-04 15:14:19", "Regular",  1000L, "ZR"
                                   )
df %>%
  mutate(Date = ymd_hms(Date)) %>% 
  filter(Date %within% interval("2021-05-01", "2021-05-31")) %>%
  mutate(class = case_when(class == "Premium" amp; set == "RS" ~ "RS (Premium)",
                           class != "Premium" amp; class != "Regular" ~ "miscellaneous",
                           class == "Premium" ~ "Premium",
                           class == "Regular" ~ "Regular")) %>% 
  group_by(class, price) %>% 
  summarise(count_of_prod_ID = n()) %>% 
  ungroup() %>% 
  mutate(`Sum of Price` = count_of_prod_ID * price,
         `Count (%)` = round((count_of_prod_ID / 7)*100, 2)) %>%
  janitor::adorn_totals() %>% 
  select(-c(price)) %>% 
  arrange(desc(count_of_prod_ID))
#>        class count_of_prod_ID Sum of Price Count (%)
#>         Total                7         7000    100.00
#> miscellaneous                2         2000     28.57
#>       Premium                2         2000     28.57
#>       Regular                2         2000     28.57
#>  RS (Premium)                1         1000     14.29
 

Комментарии:

1. Как разделить RS (Premium) количество на Premium количество в последней строке.

2. Ты хочешь считаться RS (Premium) а Premium ? Но тогда все ваши проценты будут вычтены

3. Не для всех, мне просто нужно это для последнего ряда.

4. Я не знаю, как это сделать. Если вы посчитаете RS (Premium) как a Premium (т. Е. посчитаете это дважды), то ничего не сложится , например, если RS (Premium) = 1 и Premium = 3 , то общее количество ваших продуктов будет равно 8… Я не уверен, как суммировать подмножество строк, но затем распечатать все строки. Извините.