Упорядочить гистограммы в ggplot пропорционально, в зависимости только от значения «yes» другой переменной в R - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть данные, которые выглядят так:

df <- data.frame (
cancer = c(1, 0, 1, 0, 0, 1, 0, 0, 0, 0),
CVD =    c(0, 1, 1, 0, 1, 0, 0, 0, 0, 0),
diab =   c(0, 0, 0, 1, 0, 1, 0, 0, 1, 0),
stroke = c(0, 1, 1, 0, 1, 0, 0, 0, 1, 0),
asthma = c(1, 1, 1, 0, 1, 1, 0, 0, 0, 0),
SR_hlt = c(1, 2, 2, 2, 1, 1, 2, 2, 2, 1))

Я хочу создать гистограмму, только для людей, страдающих интересующей болезнью, где бары гистограммы заказаныпо доле людей, у которых SR_hlt == 1.

Для построения этого графика я использую следующий код

1) Соберите данные

df_grp <- df %>%
gather(key = condition, value = Y_N, -SR_hlt) %>%
group_by(condition, Y_N, SR_hlt) %>%
summarise(count = n()) %>%
mutate(freq = round(count/sum(count) * 100, digits = 1))

2) Сюжетэти данные

df_plot <- df_grp  %>%
filter(Y_N == 1) %>%
ggplot(aes(x = reorder(condition, -freq), y = freq, fill = factor(SR_hlt)), width=0.5) +
geom_bar(stat="identity", position = position_dodge(0.9))
df_plot

x = reorder(condition, -freq) должен быть тем, что упорядочивает бары, но я не думаю, что это работает в этом случае, потому что значения freq зависят от значения третьей переменной, SR_hlt.Можно ли упорядочить бары по значению freq при значении SR_hlt == 1?

1 Ответ

0 голосов
/ 19 декабря 2018

Это может быть выполнено с помощью удобного пакета forcats, в частности fct_reorder2

df_plot <- df_grp  %>%
  filter(Y_N == 1) %>%
  ggplot(aes(x = fct_reorder2(condition, SR_hlt, -freq), 
             y = freq, fill = factor(SR_hlt)), width=0.5) +
  geom_bar(stat="identity", position = position_dodge(0.9))
df_plot

Это параметр condition как фактор, и, поскольку SR_hlt == 1 представляет интерес, мы организуем изот низкого к высокому для SR_hlt, затем -freq или от высокого к низкому для freq.


В качестве альтернативы, вы можете установить коэффициент перед вызовом ggplot, используя стандартный dplyr only:

df_plot <- df_grp  %>%
  ungroup() %>% 
  filter(Y_N == 1) %>%
  arrange(SR_hlt, desc(freq)) %>% 
  mutate(condition = factor(condition, unique(condition))) %>% 
  ggplot(aes(x = condition, y = freq, fill = factor(SR_hlt)), width=0.5) +
  geom_bar(stat="identity", position = position_dodge(0.9))
df_plot

В приведенном выше примере я использую arrange для сортировки кадра данных по наибольшему freq для SR_hlt.Затем я использую mutate, чтобы воспользоваться отсортированным фреймом данных, с учетом condition в порядке появления.

...