Подтвердить что ты не робот

R - упорядочение в коробке

Я пытаюсь создать серию ячеек в R, которые сгруппированы по 2 факторам. Мне удалось сделать сюжет, но я не могу получить коробки в правильном направлении.

Моя ферма данных, которую я использую, выглядит так:

Nitrogen    Species    Treatment
2           G          L
3           R          M
4           G          H
4           B          L
2           B          M
1           G          H

Я пробовал:

boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)

это упорядочило поля в алфавитном порядке (первые три были обработаны "Высокими", затем в течение трех их были упорядочены по названию вида в алфавитном порядке).

alt text

Я хочу, чтобы в блоке был задан порядок Low > Medium > High, а затем в каждой из этих групп G > R > B для вида.

Итак, я попытался использовать коэффициент в формуле:

f = ordered(interaction(mydata$Treatment, mydata$Species), 
            levels = c("L.G","L.R","L.B","M.G","M.R","M.B","H.G","H.R","H.B")

то

boxplot(mydata$Nitrogen~f)

однако ящики по-прежнему находятся в том же порядке. Этикетки теперь разные, но коробки не перемещаются.

Я вытащил каждый набор данных и построил их все отдельно:

lg = mydata[mydata$Treatment="L" & mydata$Species="G", "Nitrogen"]
mg = mydata[mydata$Treatment="M" & mydata$Species="G", "Nitrogen"]
hg = mydata[mydata$Treatment="H" & mydata$Species="G", "Nitrogen"]
etc ..

boxplot(lg, lr, lb, mg, mr, mb, hg, hr, hb)

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


Загружаемые данные:

mydata <-
structure(list(Nitrogen = c(2L, 3L, 4L, 4L, 2L, 1L), Species = structure(c(2L, 
3L, 2L, 1L, 1L, 2L), .Label = c("B", "G", "R"), class = "factor"), 
    Treatment = structure(c(2L, 3L, 1L, 2L, 3L, 1L), .Label = c("H", 
    "L", "M"), class = "factor")), .Names = c("Nitrogen", "Species", 
"Treatment"), class = "data.frame", row.names = c(NA, -6L))
4b9b3361

Ответ 1

Следующие команды создадут необходимые вам заказы, переработав факторы обработки и вида с явным ручным упорядочением уровней:

mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))

mydata$Species = factor(mydata$Species,c("G","R","B"))

alt text


изменить 1: oops Я установил его в HML вместо LMH. крепление.

edit 2: какой фактор (X, Y) делает:

Если вы используете коэффициент (X, Y) по существующему коэффициенту, он использует упорядочение значений в Y для перечисления значений, присутствующих в коэффициенте X. Здесь приведены некоторые примеры с вашими данными.

> mydata$Treatment
[1] L M H L M H
Levels: H L M
> as.integer(mydata$Treatment)
[1] 2 3 1 2 3 1
> factor(mydata$Treatment,c("L","M","H"))
[1] L M H L M H                               <-- not changed
Levels: L M H                                 <-- changed
> as.integer(factor(mydata$Treatment,c("L","M","H")))
[1] 1 2 3 1 2 3                               <-- changed

Он не меняет то, что фактор выглядит на первый взгляд, но он изменяет способ хранения данных.

Важно то, что многие функции графика будут отображать самую низкую нумерацию слева, затем следующую и т.д.

Если вы создаете факторы, просто используя factor(X), тогда обычно перечисление основано на алфавитном порядке уровней факторов (например, "H" , "L" , "M" ). Если ваши ярлыки имеют обычный порядок, отличный от алфавитного (т.е. "H" , "M", "L" ), это может сделать ваши графики кажущимися странными.

На первый взгляд может показаться, что проблема связана с упорядочением данных в кадре данных - то есть, если бы мы могли разместить все "H" наверху и "L" внизу, то это сработало бы, Это не так. Но если вы хотите, чтобы ваши ярлыки отображались в том же порядке, что и первое вхождение в данные, вы можете использовать эту форму:

 mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))

Ответ 2

fooobar.com/info/173161/... показывает, как изменить порядок boxplot на основе числового значения; вам может понадобиться только переход от factor к соответствующему типу ordered. Но трудно сказать, поскольку у нас нет ваших данных, и вы не представили воспроизводимый пример.

Изменить Используя набор данных, который вы разместили в переменной md, и полагаясь на решение, на которое я указал ранее, получаем

R> md$Species <- ordered(md$Species, levels=c("G", "R", "B"))
R> md$Treatment <- ordered(md$Treatment, levels=c("L", "M", "H"))
R> with(md, boxplot(Nitrogen ~ Species * Treatment))

который создает диаграмму, которую вы хотели создать.

Это также эквивалентно другому решению, представленному здесь.