Есть несколько способов сделать это, но, по сути, вам нужно 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