我有一个包含两个Likert变量的数据框。我想使用sjp.likert
包的sjPlot
函数绘制这两个变量。情节没有意义。
我的数据(mydf
)如下所示:
structure(list(var1 = c(1, 1, 5, NA, 3, NA, 1, NA, 4, 3, 5, 5,
4, 2, 2, NA, NA, 5, NA, NA), var2 = c(NA, NA, NA, 3, NA, 3, NA,
5, NA, NA, NA, 2, NA, NA, NA, 4, 4, NA, 1, 1)), .Names = c("var1",
"var2"), row.names = c(NA, 20L), class = "data.frame")
var1 var2
1 1 NA
2 1 NA
3 5 NA
4 NA 3
5 3 NA
6 NA 3
7 1 NA
8 NA 5
9 4 NA
10 3 NA
11 5 NA
12 5 2
13 4 NA
14 2 NA
15 2 NA
16 NA 4
17 NA 4
18 5 NA
19 NA 1
20 NA 1
这是我使用的代码:
library(sjPlot)
library(RColorBrewer)
likert_5 <- mydf
levels_5 <- list(c(1,2,3,4,5))
varnames <- names(likert_5
sjp.likert(likert_5, legendLabels=levels_5, barColor="brewer",legendSize=0.5,axisLabelSize=0.5,valueLabelSize=2,colorPalette="BrBG", orderBy="pos",legendPos="bottom",axisLabels.y=varnames)
结果如下:
我认为你同意这根本没有意义。两个变量名称相同,有四个级别而不是五个级别。有谁知道这里出了什么问题?
非常感谢提前!
答案 0 :(得分:2)
我认为这是sjp.likert
函数中的错误。逐个添加参数,我发现情节工作正常,直到包含参数orderBy = "pos"
。检查函数的源代码显示:
sjp.likert
# ...
# questionCount <- nrow(pos)/(length(legendLabels)/2)
# if (!is.null(orderBy)) {
# ...
# orderUniqueItems <- rev(1 + questionCount - orderUniqueItems)
# axisLabels.y <- axisLabels.y[orderUniqueItems]
# }
# ...
使用您的数据,我最终得到以下信息:
questionCount
# [1] 1.6
orderUniqueItems
# [1] 1.6 0.6
varnames[c(1.6, 0.6)]
# [1] "var1"
我认为作者实际上想要questionCount <-
上限(orderUniqueItems <- c(unique(orderRelatedItems)))
,这会产生您的数据:
questionCount
# [1] 2
orderUniqueItems
# [1] 2 1
varnames[c(1.6, 0.6)]
# [1] "var2" "var1"
快速修复将保存返回的绘图并手动修改标签(使用作者的代码创建粘贴'n ='的标签)。
for (i in 1:length(varnames)) {
varnames[i] <- paste(varnames[i], sprintf(" (n=%i)", length(na.omit(likert_5[,i]))), sep = "")
}
myplot <- sjp.likert(likert_5, legendLabels=levels_5, barColor="brewer", legendSize=0.5, axisLabelSize=0.5, valueLabelSize=2, colorPalette="BrBG", orderBy="pos", legendPos="bottom")
myplot$plot + scale_x_discrete(labels=varnames[c(2,1)])
编辑:
关于缺少的中间级别,我也在代码中找到了这个:
if (!is.null(neutral)) {
out <- out[out$Response != neutral, ]
}
从输出中删除中间“中性”类别。似乎没有更改此选项的选项,the author's examples中没有一个使用奇数个类别。所以它似乎是一个功能,而不是一个错误。
您可以考虑likert
包,特别是带有参数likert.bar.plot
的函数include.center = TRUE
。