Обратите внимание, что есть лучший способ записать ваш первый выбор:
df5 <- df %>% filter(Q1!="-99", Group %in% c("One", "Two"))
Я рекомендую вам явно вычислить статистику перед построением графика. функция DescTools::MultinomCI()
выполнит эту работу (см. документацию)
# Reproducible example: random
library(tidyverse)
n <- 1000
df5 <- tibble(
Q1 = sample(letters[1:7], n, replace=TRUE),
Group = sample(c("One","Two"), n, replace=TRUE)
)
library(DescTools)
df_stats <- df5 %>%
count(Group, Q1) %>%
group_by(Group) %>%
do({
df_grp <- .
df_grp %>%
select(Q1, n) %>%
bind_cols(as_tibble(MultinomCI(df_grp$n))) %>%
rename(prop = est)
})
Если вы хотите использовать гистограммы:
df_stats %>%
ggplot(aes(Q1, y=prop, ymin=lwr.ci, ymax=upr.ci, fill=Group)) +
geom_col(position="dodge") +
geom_errorbar(position="dodge") +
ylim(0, NA)
(обратите внимание, что оси столбцов всегда должны начинаться с нуля,следовательно, использование ylim
)
Однако, чтобы подчеркнуть различия между группами в ответах, линейный график будет гораздо более читабельным:
df_stats %>%
ggplot(aes(Q1, y=prop, ymin=lwr.ci, ymax=upr.ci, color=Group, group=Group)) +
geom_line() +
geom_errorbar(position="dodge", width=.2) +
ylim(0, NA)