создать гистограмму с женским полом для двух групп в ggplot r - PullRequest
0 голосов
/ 13 апреля 2020

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

Данные:

example data

Другие сообщения, связанные с этой топи c, которые я рассмотрел:

r процент от бина в гистограмме ggplot

Барплоты с несколькими факторами группировки и среднее значение переменной по этим факторам

Код, который я пробовал:

ggplot(N_group, aes(x=Age_2, fill=Sex))+
  geom_bar(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..]), position="dodge" ) +
  geom_text(aes( y=..count../tapply(..count.., ..x.. ,sum)[..x..], 
label=scales::percent(..count../tapply(..count.., ..x.. ,sum)[..x..]) ),
            stat="count", position=position_dodge(0.9), vjust=-0.5)

Это сравнивает мужчин и женщин, которые имеют заболевание "N".

1 Ответ

0 голосов
/ 13 апреля 2020

Здесь возможным решением является вычисление пропорций из ggplot2.

Вот пример использования следующего поддельного фрейма данных:

df <- data.frame(ID = 1:40,
                 N = sample(c(0,1),40,replace = TRUE),
                 age_group = sample(1:4,40, replace = TRUE),
                 sex = sample(c("M","F"),40,replace = TRUE))

Используя пакет dplyr, вы можете рассчитать долю каждой группы N для каждой возрастной группы для каждого пола:

library(dplyr)

df %>% 
  #group_by(sex, age_group, N, .drop = FALSE) %>% 
  count(sex, age_group, N) %>% 
  filter(sex =="F") %>%
  group_by(age_group) %>%
  mutate(Percent = n / sum(n))


# A tibble: 8 x 5
# Groups:   age_group [4]
  sex   age_group     N     n Percent
  <fct>     <int> <dbl> <int>   <dbl>
1 F             1     0     1   0.167
2 F             1     1     5   0.833
3 F             2     0     2   0.4  
4 F             2     1     3   0.6  
5 F             3     0     2   0.4  
6 F             3     1     3   0.6  
7 F             4     0     1   0.5  
8 F             4     1     1   0.5 

Передача этой последовательности труб в ggplot2 дает следующий график:

library(dplyr)
library(ggplot2)

df %>% 
  count(sex, age_group, N) %>% 
  filter(sex =="F") %>%
  group_by(age_group) %>%
  mutate(Percent = n / sum(n)) %>%
  ggplot(aes(x = age_group, y = Percent, fill = factor(N)))+
  geom_col(position = position_dodge())+
  scale_y_continuous(labels = scales::percent)

enter image description here

Отвечает ли он на ваш вопрос?

...