Вычислить несколько диаграмм Парето в нескольких столбцах - PullRequest
1 голос
/ 30 января 2020

Я понял, как создать диаграмму Парето, но вопрос в том, есть ли у меня таблица, где мне нужно вычислять и воспроизводить чаты Парето, я застрял.

dt <- data.table( YEAR = c("2001", "2000", "2001", "2001","1999", "2000", "2000", "1999", "1999"),
                Col1=sample(0:30, 8, rep=TRUE),
                Col2 =sample(0:45, 8, rep=TRUE),
                col33 =sample(0:60, 8, rep=TRUE)
)

Я хотел бы, например, что иметь для каждой переменной Col диаграмму и желательно отображать вместе.

Мой код для вычисления одной диаграммы:

Col1_gain <- dt[YEAR=="1999"][order (-Col1)]
Col1_gain<-Col1_gain[, !c("Col2","Col33")]
Col1_gain <- Col1_gain[, `:=` (paret=(cumsum(Col1_gain$Col1))*100/sum(Col1_gain$Col1), cum=(cumsum(Col1_gain$Col1)))]
Col1_gain$ID <- seq.int(nrow(Col1_gain))
Col1_pareto <- ggplot(Col1_gain, aes (x=ID/nrow(Col1_gain)))+ geom_line(aes(y=paret), size=1, color="firebrick")
Col1_pareto

1 Ответ

2 голосов
/ 30 января 2020

Исходя из моего понимания вашего кода для построения одной диаграммы Парето, вы выделяете один год, а затем выводите суммарную сумму, выраженную в процентах.

Итак, если вы хотите сделать это для нескольких лет и нескольких столбцов, вам сначала нужно перевести данные в более длинный формат (здесь я использую pivot_longer из tidyr, но вы можете сделать то же самое, используя melt из data.table).

Затем я сгруппирую ваши данные по году и по категориальной переменной «Var» (содержащую Col1, Col2, ...) и выражу значение в процентах от общей суммы и суммарной суммы в процентах. , Я также создаю счетчик, который в основном представляет собой номера строк, чтобы использовать его в качестве оси X.

Наконец, я использовал эти новые переменные для составления диаграммы и линии. Я разделил «Годы», используя facet_wrap. В целом, вы можете написать что-то вроде этого:

dt %>% pivot_longer(., -YEAR, names_to = "Var", values_to = "Val") %>%
  group_by(YEAR, Var) %>%
  arrange(desc(Val), .by_group = TRUE) %>%
  mutate(CumS = cumsum(Val), Count = row_number()) %>%
  mutate(CumS2 = CumS*100 / sum(Val)) %>%
  mutate(Val_Percent = Val*100/sum(Val)) %>%
  ggplot(aes(x = as.factor(Count), y = Val_Percent, fill = Var))+
  geom_col(position = position_dodge())+
  facet_wrap(.~YEAR)+
  geom_line(aes(y = CumS2, group = Var, color = Var), position = position_dodge(.9))+
  theme(axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.x = element_blank())

enter image description here

В качестве альтернативы, если вы хотите получить диаграмму Парето для "Кол" и за "Год" ", вы можете сделать то же самое, а затем использовать facet_grid вместо facet_wrap:

dt %>% pivot_longer(., -YEAR, names_to = "Var", values_to = "Val") %>%
  group_by(YEAR, Var) %>%
  arrange(desc(Val), .by_group = TRUE) %>%
  mutate(CumS = cumsum(Val), Count = row_number()) %>%
  mutate(CumS2 = CumS*100 / sum(Val)) %>%
  mutate(Val_Percent = Val*100/sum(Val)) %>%
  ggplot(aes(x = as.factor(Count), y = Val_Percent, fill = Var))+
  geom_col(position = position_dodge())+
  facet_grid(Var~YEAR)+
  geom_line(aes(y = CumS2, group = Var, color = Var), position = position_dodge(.9))+
  theme(axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.ticks.x = element_blank())

enter image description here

Это отвечает вашему вопрос?

...