r - ggplot中的李克特堆积条形图与前后测试
问题描述
我是 R 和老师的新手,所以感谢您的耐心等待。我在李克特堆积条形图上搜索了许多其他问题(这个很接近,但不完全是我正在努力解决的问题)。我似乎找不到一个讨论如何将调查前和后测试的结果拉到同一个堆叠条形图中的内容。我已经阅读了 Hayley 的 R for Data Science 一书、GitHub 上的示例、R Companion Handbook 和 R Cookbook。作为初学者,仍然确实需要一些帮助。
我有一组 12 个学生问题,每个问题都有一个测试前和测试后的回答,大小为“非常同意”到“非常不同意”。
我的问题是:学生调查问卷在考试前后有何变化?
我的数据最初显示为:
Student sex(F=0,M=1) PreTestQ1 PostTestQ1
1 0 Agree Disagree
2 0 Disagree Agree
3 1 Agree Agree
4 1 Disagree Agree
首先,我将同意/不同意转换为数值数据(非常同意 = 1,非常不同意 = 4,没有中性选项),并使用以下方法从宽到长整理数据:
# Set data frame as wide
msse_wide <- read_xls("ProcessDataMSSE.xls")
colnames(msse_wide) # Displays names of columns
head(msse_wide)
# Set data frame as long, after running wide code above
msse_long <- msse_wide %>%
gather(question,obs_prepost, c(2:25)) # This pulls the columns from 2 to 25 (not including the "sex" column), test it out first as a precaution
# NOW MY DATA IS TIDY!!!! :)
我得到了:
> msse_long
# A tibble: 1,824 x 3
sex question obs_prepost
<dbl> <chr> <dbl>
1 0 1Pre 3
2 0 1Pre 3
3 0 1Pre 2
4 0 1Pre 3
5 0 1Pre 2
6 0 1Pre 3
7 0 1Pre 3
8 0 1Pre 2
9 0 1Pre 2
10 0 1Pre 4
# … with 1,814 more rows
现在我想将强烈同意 --- 强烈不同意回答的百分比可视化为堆叠条形图,使用百分比响应,并将测试前和测试后作为堆叠条进行比较(因此,有 12 个问题前后,我将有 24 个堆叠条形图)。
最终目标类似于 R Companion: Simple Stacked Bar Chart中的这个例子......除了我被困在如何从我的数据中提取百分比,并在另一个之上比较前测试和后测试。
解决方案
像这样的东西?:
数据:
msse_wide <- read.table(text='Student sex(F=0,M=1) PreTestQ1 PostTestQ1
1 0 Agree Disagree
2 0 Disagree Agree
3 1 Agree Agree
4 1 Disagree Agree',
header=TRUE,
stringsAsFactors=FALSE)
建议使用dplyr
,tidyr
ggplot2
和的解决方案scales
:
library(dplyr)
library(tidyr)
library(ggplot2)
library(scales)
msse_wide %>%
pivot_longer(cols = -c(Student, sex.F.0.M.1.),
names_to = "Test") %>%
group_by(Test, value) %>%
summarise(N = n()) %>%
mutate(Pct = N / sum(N)) %>%
ggplot(aes(Test, Pct, fill = value)) +
geom_bar(stat="identity") +
scale_y_continuous(labels = percent)
编辑:
感谢@dc37 的评论:
添加
+ coord_flip()
上面的代码给出:
解释:
从我们使用,的后继形式的数据开始,以获得所需的结构。pivot_longer
tidyr
gather
然后我们按Test
和(个人答案级别)分组,并使用 dplyr 的函数value
通过计算每组中的案例进行总结。n
然后我们改变(在这种情况下,创建)一个列,我们将每个组合的计数除以每个组Test
的value
总和Test
(dplyr
现在仅按第一组分组,Test
)
最后,我们使用ggplot2
来绘制数据并scales
标记百分比轴。
推荐阅读
- python-3.x - 在 Google-Colab 中提取 tar.gz 文件时遇到问题
- php - PHP 示例中使用 API 的两个签名者
- c - 编译后的 C 代码无法执行。拒绝访问
- http - ESP8266 GET 请求已发送但网站未收到
- heroku - heroku、netlify、godaddy 在提供的网络托管服务方面有何不同
- asp.net-core - 如果有 CQRS、DTO 和实体,如何验证输入数据?
- jquery - 100% 进度条
- api - 没有互联网时 Flutter 崩溃
- javascript - JavaScript 最佳实践通过三个因素过滤数组
- mininet - 终结者如何打开每个mininet节点