使用R中sjPlot包plot_likert绘制分组李克特图时出错
解决sjPlot::plot_likert分组绘制报错问题
错误原因
报错Error: Length of groups has to equal the number of items: ncol(items) != length(groups)是因为plot_likert的groups参数要求长度等于李克特项目的列数,但你传入的mydf1$Domain是每行观测的分组标签(长度等于数据行数),两者长度不匹配。
解决方案
要实现按Teacher/Student分组的李克特图,有两种简洁的处理方式:
方法一:将宽格式数据转为长格式绘制
先把数据转换为长格式,让每个观测对应一行项目-响应-分组的记录,再用group参数指定分组:
library(sjPlot) library(ggplot2) library(readxl) library(tidyr) library(dplyr) # 修正路径格式(Windows用双反斜杠或正斜杠) mydf1 <- read_excel("C:\\Users\\HP\\Desktop\\aa\\source_teacher.xlsx") mydf1 <- data.frame(mydf1) mydf1$Domain <- factor(mydf1$Domain) legend_labels <- c("1 Never", "2 Sometime", "3 Often", "4 Very Often") # 宽格式转长格式 mydf_long <- mydf1 %>% pivot_longer(cols = -Domain, names_to = "Item", values_to = "Response") # 绘制分组李克特图 p <- plot_likert( data = mydf_long, items = Response, group = Domain, item_labels = unique(mydf_long$Item), catcount = 4, legend.labels = legend_labels ) p + theme( axis.text.y = element_text(color = "black", size = 14), legend.position = "bottom" )
方法二:拆分数据为分组后绘制
将原数据按Domain拆分为两个独立的宽格式数据框,放在列表中传入plot_likert,函数会自动识别列表元素为分组:
library(sjPlot) library(ggplot2) library(readxl) library(dplyr) # 修正路径格式 mydf1 <- read_excel("C:\\Users\\HP\\Desktop\\aa\\source_teacher.xlsx") mydf1 <- data.frame(mydf1) mydf1$Domain <- factor(mydf1$Domain) legend_labels <- c("1 Never", "2 Sometime", "3 Often", "4 Very Often") # 按分组拆分数据 teacher_df <- mydf1 %>% filter(Domain == "Teacher") %>% select(-Domain) student_df <- mydf1 %>% filter(Domain == "Student") %>% select(-Domain) # 绘制分组李克特图 p <- plot_likert( list(Teacher = teacher_df, Student = student_df), catcount = 4, legend.labels = legend_labels ) p + theme( axis.text.y = element_text(color = "black", size = 14), legend.position = "bottom" )
额外注意点
原代码中的文件路径存在转义问题,Windows系统下需用双反斜杠\\或正斜杠/替代单反斜杠,否则会导致文件读取失败。
内容的提问来源于stack exchange,提问作者Ranadip Chandra
相关产品推荐
相关产品推荐

