#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. Большое спасибо.