для цикла с ggplot — ошибка в rep_len(TRUE, nrow(x)) : недопустимое значение «length.out»

#r #for-loop #ggplot2

Вопрос:

Я настраиваю способ расчета и сохранения диаграмм в определенном стиле компании. Я нашел все, что мне нужно, с помощью пользовательских опций ggplot, но все еще застрял, чтобы встроить это в цикл. У меня есть примерно 110 столбцов/переменных, к которым это можно применить.

Мои данные:

 test <- structure(list(Intensitaet_Wareneingang = structure(c(Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_, 
Intensitaet_Wareneingang = NA_integer_, Intensitaet_Wareneingang = NA_integer_
), .Label = c("sehr gering", "gering", "mittel", "hoch", "sehr hoch", 
"keine Angabe", "NA"), class = "factor"), Zufriedenheit_Wareneingang = c(NA, 
"keine Angabe", "mittel", "hoch", "hoch", "mittel", "hoch", NA, 
"sehr hoch", "keine Angabe", NA, "keine Angabe", "keine Angabe", 
"keine Angabe", "hoch", "hoch", "mittel", "mittel", NA, "mittel", 
NA), Intensitaet_Einlagerung = c(NA, "mittel", "gering", "hoch", 
"hoch", "gering", "sehr hoch", NA, "sehr hoch", "mittel", NA, 
"sehr gering", "sehr gering", "sehr gering", "gering", "sehr hoch", 
"sehr hoch", "mittel", NA, "hoch", NA), Zufriedenheit_Einlagerung = structure(c(Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_, 
Zufriedenheit_Einlagerung = NA_integer_, Zufriedenheit_Einlagerung = NA_integer_
), .Label = c("sehr gering", "gering", "mittel", "hoch", "sehr hoch", 
"keine Angabe", "NA"), class = "factor")), row.names = c(NA, 
-21L), class = c("tbl_df", "tbl", "data.frame"))
 

Моя цель:

  • отсортируйте допустимые значения, исключите пропуски и тех, кто решил не отвечать в этом столбце
  • выводите только значения, выбирайте цвет и количество отображаемых случаев
  • кроме того, я хочу включить команду записи, чтобы в моем рабочем каталоге было 110 гистограмм

Где я застрял

 for (i in 1:4) {
  test[,c(i)] <- factor((test[ ,c(i)]), levels = c("sehr gering" , "gering", "mittel", "hoch", "sehr hoch", "keine Angabe", "NA"))
  print(ggplot(data=subset.data.frame((test[ ,c(i)]) %in% c("sehr gering" , "gering", "mittel", "hoch", "sehr hoch")), aes(x=(test[ ,c(i)]))))    
    geom_bar(fill = "cornflowerblue", 
             color="black")  
    geom_text(aes(label=stat(count)), stat = "count", vjust=-.75)  
    labs(subtitle = paste("n gesamt: ", nrow(subset(test[ ,c(i)] %in% c("sehr gering" , "gering", "mittel", "hoch", "sehr hoch"))), y = "Häufigkeit"))  
    scale_y_continuous(labels = scales::percent) }

 

Это приведет к появлению сообщения об ошибке:
error in rep_len(TRUE, nrow(x)) : invalid 'length.out' value .

Использование ggplot (без печати) и присвоение имени одной переменной работает. Любые предложения о том, как я мог бы, наконец, запустить этот цикл, высоко ценятся. Я не нашел sth. подобного на форуме еще нет.

Большое спасибо

Ответ №1:

Попробуйте использовать этот код —

  • В for цикле я передаю имена столбцов вместо номера.
  • Используется [[]] для подмножества соответствующих столбцов и изменения их на factor .
  • Создайте subset_data отдельный фрейм данных, чтобы упростить его повторное использование.
  • Используется .data для ссылки на столбцы в aes .
 library(ggplot2)

for (i in colnames(test)) {
  test[[i]] <- factor(test[[i]], levels = c("sehr gering" , "gering", "mittel", "hoch", "sehr hoch", "keine Angabe", "NA"))
  subset_data <- subset(test, test[[i]] %in% c("sehr gering" , "gering", "mittel", "hoch", "sehr hoch"))
  print(ggplot(data=subset_data, aes(x= .data[[i]]))    
    geom_bar(fill = "cornflowerblue", 
             color="black")  
    geom_text(aes(label=stat(count)), stat = "count", vjust=-.75)  
    labs(subtitle = paste("n gesamt: ", nrow(subset_data), y = "Häufigkeit"))  
    scale_y_continuous(labels = scales::percent)) 
}
 

Комментарии:

1. Дорогой Ронак, это как раз то улучшение, которое я искал. Я ограничил количество столбцов номером [начало:конец] в for (я в colnames(тест[2:5])), чтобы я не получал график для своей переменной id. Большое спасибо.