Как изменить или транспонировать выбранные столбцы в наборе данных при выполнении расчетов? - PullRequest
0 голосов
/ 16 мая 2018

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

like so.

Вот CSV для набора данных:

Year,Month,Country,Associate,Sales Revenue,Customer Segment
2015,1,USA,Bill,20,Enterprise
2015,1,USA,Bill,10,Enterprise
2015,1,Germany,Bill,5,Consumer
2015,1,USA,Bill,5,Enterprise
2015,1,Germany,Ted,5,Consumer
2015,1,USA,Bill,10,Consumer
2015,1,Germany,Bill,5,Consumer
2015,1,Germany,Ted,20,Enterprise
2015,1,Germany,Ted,20,Consumer

1 Ответ

0 голосов
/ 16 мая 2018

Есть несколько способов сделать это, но, по сути, вам нужно group_by столбцы, значения которых не должны изменяться, а затем summarise для создания новых переменных.

Вы можете ввести все иподмножество случаев, которые вас интересуют:

library(tidyverse)

df <- read_csv('Year,Month,Country,Associate,Sales Revenue,Customer Segment
2015,1,USA,Bill,20,Enterprise
2015,1,USA,Bill,10,Enterprise
2015,1,Germany,Bill,5,Consumer
2015,1,USA,Bill,5,Enterprise
2015,1,Germany,Ted,5,Consumer
2015,1,USA,Bill,10,Consumer
2015,1,Germany,Bill,5,Consumer
2015,1,Germany,Ted,20,Enterprise
2015,1,Germany,Ted,20,Consumer')

df %>% 
    group_by(Year, Month, Country, Associate) %>% 
    summarise(`Total Sales Revenue` = sum(`Sales Revenue`), 
              `Enterprise Sales %` = sum(`Sales Revenue`[`Customer Segment` == 'Enterprise']) / 
                  `Total Sales Revenue`* 100, 
              `Consumer Sales %` = sum(`Sales Revenue`[`Customer Segment` == 'Consumer']) / 
                  `Total Sales Revenue` * 100)
#> # A tibble: 3 x 7
#> # Groups:   Year, Month, Country [?]
#>    Year Month Country Associate `Total Sales Revenue` `Enterprise Sales %`
#>   <dbl> <dbl> <chr>   <chr>                     <dbl>                <dbl>
#> 1  2015     1 Germany Bill                         10                  0  
#> 2  2015     1 Germany Ted                          45                 44.4
#> 3  2015     1 USA     Bill                         45                 77.8
#> # ... with 1 more variable: `Consumer Sales %` <dbl>

... или сделайте это более программно с помощью tidyr::spread (что приведет к большему масштабированию переменных):

df %>% 
    janitor::clean_names() %>% 
    group_by(year, month, country, associate, customer_segment) %>% 
    summarise(revenue = sum(sales_revenue)) %>% 
    mutate(percent = revenue / sum(revenue) * 100) %>% 
    spread(customer_segment, percent) %>% 
    summarise_all(sum, na.rm = TRUE)
#> # A tibble: 3 x 7
#> # Groups:   year, month, country [?]
#>    year month country associate revenue Consumer Enterprise
#>   <dbl> <dbl> <chr>   <chr>       <dbl>    <dbl>      <dbl>
#> 1  2015     1 Germany Bill           10    100          0  
#> 2  2015     1 Germany Ted            45     55.6       44.4
#> 3  2015     1 USA     Bill           45     22.2       77.8
...