Как упорядочить geom_col по наибольшей средней пропорции для группы, а затем построить столбчатый столбец - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть данные, которые я хотел бы упорядочить по наибольшему среднему значению по группе, а затем отобразить их в виде столбика с накоплением.Мне удалось сделать это путем создания нескольких фреймов данных, но это многословно, и мне интересно, был ли менее подробный способ сделать это?

set.seed(3)
   x <- rep(letters[1:5], 3)
fill <- rep(letters[24:26], 5)
   n <- runif(15, 0, 1)
  df <- data.frame(x, fill, n)

df2 <- df %>%
  group_by(x) %>%
  mutate(percent = n/sum(n))

df3 <- df2 %>%
  group_by(fill) %>%
  summarise(mean = mean(percent))  %>%
  ungroup() %>%
  arrange(desc(mean))

df3 <- df2[df2$fill == df3$fill[1], ] %>%
  arrange(desc(percent))
df$x <- factor(df$x, levels = df3$x)    

ggplot(data = df, aes(x, y, fill = fill)) +
  geom_col(position = position_fill()) 

enter image description here

1 Ответ

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

Я не уверен, что это обязательно лучше, но вот один подход, который дает тот же график в вашем вопросе:

df %>%
  group_by(x) %>%
  mutate(pct = n / sum(n)) %>%
  ungroup() %>%
  arrange(fill != "z", desc(pct)) %>%
  group_by(fill) %>%
  mutate(order = row_number()) %>%
  ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
  geom_col()

В зависимости от того, что вы на самом деле пытаетесь сравнить, вы можете рассмотретьдругой порядок или, возможно, аспекты.Например, рассмотрим, что происходит, когда вы выбираете фасет против укладки:

df %>% 
  group_by(x) %>%
  mutate(pct = n / sum(n)) %>%
  ggplot(aes(x, pct, fill = fill)) +
  geom_col() +
  facet_wrap(~ fill)

enter image description here

Обновление 2019-02-18 (за комментарии) Обновлениеабстрагироваться, зная z раньше времени.Упорядочение по mean(pct) для каждого fill, за которым следует pct:

df %>%
  group_by(x) %>%
  mutate(pct = n / sum(n)) %>%
  group_by(fill) %>%
  mutate(mean_pct = mean(pct)) %>%
  arrange(desc(mean_pct), desc(pct)) %>%
  mutate(order = row_number()) %>%
  ggplot(aes(fct_reorder(x, order), pct, fill = fill)) +
  geom_col()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...