2

我正在尝试分析一项调查,其中允许对同一受访者进行多项答复。目标是确定每个班级中给出 3 种可能回答的参与者的数量,以便将其绘制在条形图上。

例如,如果我的数据框df如下所示:

ID q1 q2 q3 班级
001 不适用 一个
002 不适用 一个
003 不适用 一个
004 不适用 不适用
005 不适用
006 不适用
007 C
008 不适用 不适用 C

我想确定分别给出每个答案的 A、B 和 C 类受访者的百分比。我的预期答案如下所示:

班级 q 聚氯乙烯
一个 0.67
一个 0.67
一个 0.67
0.33
1.00
0.33
C 0.50
C 1.00
C 0.50

我想将我的答案保留为数据框,因为我想使用该ggplot2包将结果频率与我拥有的其他变量(如cls上面数据框中的变量)结合起来。

现在我只能确定原始频率,因为每当我尝试绘制百分比时,我都会得到相对于每个类别的答案总数的百分比。例如,对于 A 类,我得到:|class| q |perc| |--|--|--| |一个| 猫 |0.33| |一个| 狗 |0.33| |一个| 鸟 |0.33|

这是我尝试过的:

library(tidyr)
library(ggplot2)

idno <- 1:8
q1 <- c('cat','cat',NA, NA, 'cat',NA,'cat',NA)
q2 <- c('dog',NA,'dog','dog','dog','dog','dog','dog')
q3 <- c(NA,'bird','bird',NA,NA,'bird','bird',NA)
cls <- c('A','A','A','B','B','B','C','C')

df <- data.frame(idno,q1,q2,q3,cls)

df1 <- gather(df,"animal","ans",2:4)
ggplot(df1[!is.na(df1$ans),], aes(x=ans, group=cls)) + geom_bar(aes(y=..prop..,fill=cls),position='dodge')

有没有一种方法可以让每个子类别的频率不除以答案的数量,而是除以该类别的受访者数量

当前图表

4

1 回答 1

1

您必须设置美学ylabelto..prop..position' 宽度。vjust对齐条形内的标签。

ggplot(df1[!is.na(df1$ans),], aes(x = ans, group = cls, fill = cls)) + 
  geom_bar(aes(y = ..prop..), position = position_dodge(width = 1)) +
  geom_text(aes(y = ..prop.., label = scales::percent(..prop..)),
            stat = 'count', position = position_dodge(width = 1), vjust = -0.5)

在此处输入图像描述

于 2021-12-13T20:46:04.610 回答