Решение Юрия работает только тогда, когда оно суммирует до 100. Я думаю, что вы должны как-то рассчитать пропорцию, иначе вы не сможете отсортировать заранее. Итак, в первой части я манипулирую данными, добавляя столбец p, 1, если да, 0, если нет.
library(dplyr)
library(ggplot2)
set.seed(99)
df <- data.frame(
Reason = sample(rep(c("R1", "R2", "R3", "R4"), each = 100)),
Answer = sample(rep(c("yes", "no", "no", "no"), 100)))
head(df %>% mutate(p=as.numeric(Answer=="yes")),3)
Reason Answer p
1 R3 no 0
2 R3 yes 1
3 R1 no 0
Затем мы строим график с этим фреймом данных, а ось y является просто средним значением каждого группа на оси х, и мы можем использовать stat_summary
с fun.y=mean
. Теперь reorder
работает очень хорошо в этом случае, потому что вычисляет средние значения для каждой категории и переупорядочивает в соответствии с этим:
ggplot(df %>% mutate(p=as.numeric(Answer=="yes")),
aes(x=reorder(Reason,p),y=p)) +
stat_summary(fun.y="mean",geom="bar",fill="orchid4")
И это будет работать для ситуаций, когда у вас разное количество наблюдений для разных категорий:
set.seed(100)
df <- data.frame(
Reason = rep(c("R1", "R2", "R3", "R4"),times=seq(50,200,length.out=4)),
Answer = sample(c("yes","no"),500,prob=c(0.5,0.5),replace=TRUE)
)
# we expect
sort(tapply(df$Answer=="yes",df$Reason,mean))
R2 R4 R3 R1
0.460 0.505 0.520 0.540
ggplot(df %>% mutate(p=as.numeric(Answer=="yes")),
aes(x=reorder(Reason,p),y=p)) +
stat_summary(fun.y="mean",geom="bar",fill="orange")