Постройте несколько коробчатых диаграмм, используя столбцы фрейма данных в R

У меня есть фреймворк со столбцом категориальных данных (два возможных значения) и несколькими столбцами переменных. Мне нужно построить несколько коробчатых графиков, по одному для каждого столбца переменных. На каждом графике сравнивается значение переменной между двумя категориальными группами, указанными в столбце 1. Пока что он работает, записывая индивидуальный вызов графика для каждого столбца.

#CREATE DATASET
mydata <- data.frame(matrix(rlnorm(30*10,meanlog=0,sdlog=1), nrow=30))
colnames(mydata) <- c("categ", "var1","var2", "var3","var4", "var5", "var6", "var7", "var8", "var9")
mydata$var2 <- mydata$var2*5
mydata$categ <- sample(1:2)
mydata

#LAYOUT
par(mfrow=c(3,3), mar=c(4,4,0.5,0.5), mgp = c(1.5, 0.3, 0), tck = -0.01)

#BOXPLOTS
boxplot(var1 ~ categ, data = mydata, outpch = NA, ylim = c(0, 8), Main = "Title", ylab="VarLevel", tck = 1.0, names=c("categ1","categ2"))
stripchart(var1 ~ categ, data = mydata, vertical = TRUE, method = "jitter", ylim = c(0, 8), pch = 21, cex = 1, col=c(rgb(255, 0, 0, 100, max = 255), rgb(0, 0, 255, 100, max = 255)), bg = rgb(255, 255, 255, 10, max = 255), add = TRUE)
test <- wilcox.test(var1 ~ categ, data = mydata)
pvalue <- test$p.value
pvalueformatted <- format(pvalue, digits=3, nsmall=2)
mtext(paste(colnames(mydata)[2], " p = ", pvalueformatted), side=1, line=-13, at=0.9, cex = 0.6)

boxplot(var2 ~ categ, data = mydata, outpch = NA, ylim = c(0, 40), Main = "Title2", ylab="VarLevel", tck = 1.0, names=c("categ1","categ2"))
stripchart(var2 ~ categ, data = mydata, vertical = TRUE, method = "jitter", ylim = c(0, 40), pch = 25, cex = 1, col=c(rgb(255, 0, 0, 100, max = 255), rgb(0, 0, 255, 100, max = 255)), bg = rgb(255, 255, 255, 10, max = 255), add = TRUE)
test <- wilcox.test(var2 ~ categ, data = mydata)
pvalue <- test$p.value
pvalueformatted <- format(pvalue, digits=3, nsmall=2)
mtext(paste(colnames(mydata)[3], " p = ", pvalueformatted), side=1, line=-13, at=0.9, cex = 0.6)

Два вопроса:
1) Я хотел бы использовать функцию или цикл for для создания сценария вызова графика для каждого столбца данных. Не знаю, как это сделать. Я видел несколько связанных сообщений, но не смог до них добраться. Попытка использовать базовые функции на данный момент, хотя при необходимости можно рассмотреть ggplot или другие.
2) Как часть цикла / функции, есть ли способ настроить масштаб оси Y каждого графика, чтобы приспособить диапазон Переменная? Таким образом, для данного столбца, если максимальное значение равно 2, масштаб оси Y будет увеличиваться до 4. Если максимальное значение равно 100, ось Y будет увеличиваться до 110.

Мысли оценены


person marcel    schedule 05.04.2014    source источник
comment
Хороший воспроизводимый вопрос - спасибо.   -  person jbaums    schedule 05.04.2014


Ответы (1)


Я бы sapply над вектором номеров столбцов и подмножеством mydata до интересующего столбца в функции. Путем итерации по номерам столбцов, а не по самим столбцам, вы получаете легкий доступ к правильному colname, который будет добавлен к графику позже.

Вам также необходимо добавить небольшое внешнее поле (oma) к стороне 3 (вверху), чтобы значение p можно было напечатать там для первых 3 графиков.

Чтобы ответить на ваш второй вопрос - вопрос об уменьшении пределов y для соответствия диапазону данных - это будет автоматически, если вы укажете outline=FALSE для подавления построения выбросов. (В вашем коде вы просто указали NA в качестве символа построения, чтобы скрыть их, но boxplots по-прежнему считали их частью данных при определении пределов оси.) Однако, установив outline=FALSE, вычисляемые пределы y не будут учитывать какие-либо выбросы, которые в противном случае были бы нанесены вызовом stripchart (который я теперь изменил на points, поскольку он немного проще).

par(mfrow=c(3,3), mar=c(3, 3, 0.5, 0.5), mgp = c(1.5, 0.3, 0), tck = -0.01,
    oma=c(0, 0, 1, 0))

sapply(seq_along(mydata)[-1], function(i) {
  y <- mydata[, i]
  boxplot(y ~ mydata$categ, outline=FALSE, ylab="VarLevel", tck = 1.0, 
          names=c("categ1","categ2"), las=1)
  points(y ~ jitter(mydata$categ, 0.5), 
     col=ifelse(mydata$categ==1, 'firebrick', 'slateblue'))
  test <- wilcox.test(y ~ mydata$categ)
  pvalue <- test$p.value
  pvalueformatted <- format(pvalue, digits=3, nsmall=2)
  mtext(paste(colnames(mydata)[i], " p = ", pvalueformatted), side=3, 
        line=0.5, at=0.9, cex = 0.6)  
})

Обратите внимание, что я также изменил ваш вызов mtext для построения на стороне 3, вместо того, чтобы указывать сторону 1 с большим отрицательным полем.

boxplots

person jbaums    schedule 05.04.2014
comment
Арг. Ты был там на 2 секунды раньше меня. :) - person Rich Scriven; 05.04.2014
comment
Последние несколько дней у нас идет довольно эпическая битва;) - person jbaums; 05.04.2014
comment
Отличное решение и именно то, что я ищу. Спасибо. Пытаюсь убедиться, что понимаю: что делает seq_along? Кроме того, с помощью этого решения, если есть очень большое количество столбцов, как я могу ограничить количество графиков на странице 12? Придется ли мне разбивать фрейм данных на отдельные фреймы данных с 12 столбцами? - person marcel; 05.04.2014
comment
Вы можете протестировать seq_along, чтобы проверить, что он делает. seq_along(mydata) возвращает целочисленную последовательность от 1 до length(mydata). В большинстве случаев это эквивалентно 1:ncol(mydata) или 1:length(mydata) (хотя, если mydata является матрицей, а не длиной кадра данных, это вызовет проблемы). Я отбрасываю первый элемент последовательности, поскольку мы не рассматриваем категории как данные для построения графика. - person jbaums; 05.04.2014
comment
Наша спецификация mfrow=c(3, 3) гарантирует, что будет построено только 9 графиков. После этого будет создано новое окно графика. Если вы хотите вместо этого 4 ряда по 3, сделайте mfrow=c(4, 3). Если вы используете RStudio, вы можете прокручивать различные окна графика вперед и назад и экспортировать их по желанию. В качестве альтернативы вставьте png('some_boxplots%d.png') перед всем блоком sapply и dev.off() после него, и %d в имени файла включит разбиение на страницы с графиками 4x3 с именами 'some_boxplots1.png', 'some_boxplots2.png' и т. Д. - person jbaums; 05.04.2014
comment
Только что получил отличный урок R. Большое спасибо! - person marcel; 05.04.2014