#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)
как aPremium
(т. Е. посчитаете это дважды), то ничего не сложится , например, еслиRS (Premium) = 1
иPremium = 3
, то общее количество ваших продуктов будет равно 8… Я не уверен, как суммировать подмножество строк, но затем распечатать все строки. Извините.