I am trying to read data from an excel sheet, into a likert diagram. I have used this code successfully to generate 10's of likert scale data visualizations, but just this morning I am getting the following error (even from old code that worked less than 7 days ago!). I have not altered the original Excel file.
Here is my code (I apologize if this is wrong, I could not locate the insert "R" code option):
library(ggplot2)
library(readxl)
library(tidyverse)
library(HH)
thesis <- read_excel("C:/Users/aarde/Desktop/Thesis_scrubbed.xlsx",sheet = "Gamer Data",range = "K1:M8")
names(thesis) <- c("Q10. More Scenarios","Q18. Play Again?", "Q20. More Code Orange")
thesis$`Q10. More Scenarios` = factor(thesis$`Q10. More Scenarios` , levels = c("1 - Strongly Disagree", "2 - Disagree", "3 - Neutral", "4 - Agree", "5 - Strongly Agree"), ordered = TRUE)
thesis$`Q18. Play Again?` = factor(thesis$`Q18. Play Again?`, levels = c("1 - Strongly Disagree", "2 - Disagree", "3 - Neutral", "4 - Agree", "5 - Strongly Agree"), ordered = TRUE)
thesis$`Q20. More Code Orange` = factor(thesis$`Q20. More Code Orange`, levels = c("1 - Strongly Disagree", "2 - Disagree", "3 - Neutral", "4 - Agree", "5 - Strongly Agree"), ordered = TRUE)
thesis <- as.data.frame(thesis)
#thesis <- subset(thesis, select = -NA)
thesisLikert = likert(thesis)
p <- likert::likert.bar.plot(thesisLikert, group.order = names(thesis), center = 3)
p + labs(title = "Future Expansion", subtitle = "Gamers", x = "Questions", y = "Percentage Response")
Here is what I have done so far:
- I have verified that the Excel range is correct, and does not contain any NA or NAN responses.
- I have verified the lengths of the thesis
object,
dimnames(2), and justlength(names(thesis)). - I removed the "labs" code in case this was somehow causing the issue (it isn't). I attempted to subset my data as I noticed an NA column sometimes (? - it is not consistent!) is loaded into thesis after using as.data.frame (this does not work, and this NA column is not from anywhere else in my excel sheet - just a bunch of random responses). Besides, I have not been able to recreate this behaviour (hence, no screengrab).
What I know so far:
- It is reading in the data correctly from the Excel sheet.
- Thesis contains the right information before we frame it.
- Names(thesis) contains the right information.
I see no discrepancy here - dimnames[2] appears to have 3 elements contained within it. I have 3 elements in my thesis object. Any clarification is appreciated.
edit: small typo
dputs output:
dput(thesis)
structure(list(`Q10. More Scenarios` = structure(c(5L, 3L, 4L,
5L, 5L, 4L, 4L), levels = c("1 - Strongly Disagree", "2 - Disagree",
"3 - Neutral", "4 - Agree", "5 - Strongly Agree"), class = c("ordered",
"factor")), `Q18. Play Again?` = structure(c(5L, 2L, 4L, 5L,
5L, 5L, 4L), levels = c("1 - Strongly Disagree", "2 - Disagree",
"3 - Neutral", "4 - Agree", "5 - Strongly Agree"), class = c("ordered",
"factor")), `Q20. More Code Orange` = structure(c(5L, 3L, 3L,
4L, 4L, 5L, 5L), levels = c("1 - Strongly Disagree", "2 - Disagree",
"3 - Neutral", "4 - Agree", "5 - Strongly Agree"), class = c("ordered",
"factor"))), row.names = c(NA, -7L), class = "data.frame")

Seems like Chris' hunch is correct, there's a name conflict on "likert". You can use
conflicts()to look for conflicts. If you callconflicts(details=TRUE), you'll see that bothlikertandHHhas a function of that name. Which of the two functions you get when you calllikert()typically depends on the order the packages were attached in; the last attached package will mask any conflicting names from previously attached packages, and you'll get a warning like:The general solution is to not have a bunch of packages attached that you don't need. Keep in mind that a package might load other packages it depends on,
tidyversefor example will on its own load 30 packages. That's just asking for trouble. You can detach individual packages by usingdetach(). For example, runningdetach(package:HH)will clear the mask in question. In general, it's good practice to just restart R on occasion to keep things under control.If you rely on packages that have name conflicts, the most straight forward solution is to use the double colon operator as you did in
likert::likert.bar.plot(). Although in this case it might have been used to access the function without loading the package namespace. Are you sure you attachedlikertat all? In any case,likert::likert()should solve it.