Комплексная группировка и подсчет - PullRequest
0 голосов
/ 13 февраля 2019

Допустим, у меня есть набор данных, который выглядит как

Country, Sold, Model
China, 100, Toyota
China, 200, Honda
China, 200, Suzuki
USA, 100, Tesla
USA, 50, Shevi
USA, 50, Lambo

И я хочу получить вывод, например

China, Toyota[20%]; Honda[40%]; Suzuki[40%]
USA, Tesla[50%]; Shevi[25%]; Lambo[25%]

, чтобы данные были сгруппированы по странам, а затем длякаждая модель автомобиля, ее доля продажи отображается рядом с названием модели.Можно ли добиться с помощью R?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Появляется, что вы хотите, чтобы проценты строк табуляции по странам и моделям.Это дает таблицу со всеми возможными комбинациями этих двух факторов:

100*prop.table(                # multiply proportions to get percentages
   with(dat, tapply(Sold, list(Country,Model), sum, default=0)),  #apply sum in categories
                    1)         # the "1" indicates these should be row proportions
       Honda  Lambo  Shevi  Suzuki  Tesla  Toyota
China     40      0      0      40      0      20
USA        0     25     25       0     50       0
0 голосов
/ 13 февраля 2019

РЕДАКТИРОВАНИЕ: Извините, это супер-хакер, но это лучшее, что я могу сделать.Я уверен, что есть лучший способ, и надеюсь, что кто-то сможет показать вам лучший путь в ближайшее время.

library(dplyr)
df <- tribble(
  ~Country, ~Sold, ~Model,
  "China", 100, "Toyota",
  "China", 200, "Honda",
  "China", 200, "Suzuki",
  "USA", 100, "Tesla",
  "USA", 50, "Shevi",
  "USA", 50, "Lambo")
)

model_by_country <- df %>% 
  group_by(Country, Model) %>% 
  summarize(Total_Sold = sum(Sold)) %>% 
  group_by(Country) %>% 
  mutate(Percent_Sold = Total_Sold / sum(Total_Sold)) %>% 
  select(-Total_Sold) %>% 
  ungroup()
model_by_country

##   Country Model  Percent_Sold
##   <chr>   <chr>         <dbl>
## 1 China   Honda          0.4 
## 2 China   Suzuki         0.4 
## 3 China   Toyota         0.2 
## 4 USA     Lambo          0.25
## 5 USA     Shevi          0.25
## 6 USA     Tesla          0.5 

# EDITS begin here
format_country_per <- function(country) {
  model_by_country %>% 
    filter(Country == country) %>% 
    mutate(Model_Percent_Sold = paste0(Model, "[", 100 * Percent_Sold, "%]")) %>% 
    .$Model_Percent_Sold %>% 
    paste(., collapse = "; ") %>% 
    paste(country, ., sep = ", ")
}

format_country_per("China")
## [1] "China, Honda[40%]; Suzuki[40%]; Toyota[20%]"
format_country_per("USA")
## [1] "USA, Lambo[25%]; Shevi[25%]; Tesla[50%]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...