#r #dataframe #for-loop #boxplot
#r #фрейм данных #цикл for #прямоугольная диаграмма
Вопрос:
Я пытался создать «цикл for». Я хотел перебирать различные столбцы фрейма данных «iris», создавая таким образом прямоугольную диаграмму для каждой числовой переменной в зависимости от переменной «species» (которая является символьной). Блок-графики должны быть вместе (3 смежных друг с другом). Я считаю, что с моим использованием функции par() также что-то не так.
Спасибо!
mybp<-NULL
par(mfrow = c(1,3))
for (i in colnames(iris)){
if (class(iris[,i]) == 'numeric'){
par(mfrow = c(1,3))
mybp<-boxplot(data=iris, iris[, i]~Species, main="variable by flower species", col=c("green","blue","red"))
}
}
mybp
Ответ №1:
Другой вариант:
names(which(sapply(iris, is.numeric) == TRUE)) -> x #numeric columns
par(mfrow = c(1,length(x)))
for (i in 1:length(x)) {
boxplot(data=iris, iris[, x[i]] ~ Species, main="variable by flower species", col=c("green","blue","red"), ylab = x[i])
}
Ответ №2:
Существует четыре числовых столбца, поэтому вы можете использовать четыре смежных графика друг с другом.
Вы можете сделать это проще, чем в for
цикле. names(iris)[sapply(iris, is.numeric)]
Здесь указаны имена столбцов числовых столбцов. Затем внешний sapply
цикл перебирает эти имена и создает boxplot
s. Используя reformulate
, вы получаете формулу для каждой итерации, например Sepal.Length ~ Species
, для первой.
Для общего заголовка мы используем title
.
op <- par(mfrow = c(1,4))
sapply(names(iris)[sapply(iris, is.numeric)], function(y)
boxplot(reformulate("Species", y), iris, col=2:4))
title("Variable by flower species", line=-2.5, outer=TRUE, cex.main=2, font.main=2)
par(op)
Однако вы также можете исправить свой for
цикл. Вам не нужно ничего назначать в цикле:
for (i in colnames(iris)) {
if (class(iris[,i]) == 'numeric'){
boxplot(data=iris, iris[, i] ~ Species, main="variable by flower species",
col=c("green","blue","red"))
}
}