R – ordenando en un diagtwig de caja

Estoy tratando de producir una serie de diagtwigs de cajas en R que están agrupados por 2 factores. Logré hacer la ttwig, pero no puedo ordenar las cajas en la dirección correcta.

Mi granja de datos que estoy usando se ve así:

Nitrogen Species Treatment 2 GL 3 RM 4 GH 4 BL 2 BM 1 GH 

Lo intenté:

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

esto ordenó los cuadros alfabéticamente (los primeros tres fueron los tratamientos “Altos”, luego dentro de esos tres se ordenaron por nombre de especie alfabéticamente).

texto alternativo

Quiero el diagtwig de caja ordenado Bajo> Medio> Alto y luego dentro de cada uno de esos grupos G> R> B para la especie.

Así que traté de usar un factor en la fórmula:

 f = ordered(interaction(mydata$Treatment, mydata$Species), levels = c("LG","LR","LB","MG","MR","MB","HG","HR","HB") 

entonces:

 boxplot(mydata$Nitrogen~f) 

sin embargo, las cajas aún se calzan en el mismo orden. Las tags ahora son diferentes, pero las cajas no se han movido.

He sacado cada conjunto de datos y los he trazado todos juntos de forma individual:

 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) 

Esto da lo que quiero, pero preferiría hacer esto de una manera más elegante, así que no tengo que sacar cada uno individualmente para conjuntos de datos más grandes.


Datos cargables:

 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)) 

Los siguientes comandos crearán el orden que necesita al reconstruir los factores de Tratamiento y Especies, con un orden manual explícito de los niveles:

 mydata$Treatment = factor(mydata$Treatment,c("L","M","H")) mydata$Species = factor(mydata$Species,c("G","R","B")) 

texto alternativo


edición 1 : oops Lo había configurado en HML en lugar de LMH. fijación.

edición 2: qué factor (X, Y) hace:

Si ejecuta el factor (X, Y) sobre un factor existente, utiliza el orden de los valores en Y para enumerar los valores presentes en el factor X. Aquí hay algunos ejemplos con sus datos.

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

NO cambia el aspecto del factor a primera vista, pero sí cambia la forma en que se almacenan los datos.

Lo importante aquí es que muchas funciones de trazado trazarán la enumeración más baja a la izquierda, seguida por la siguiente, etc.

Si crea factores simplemente utilizando el factor(X) , generalmente la enumeración se basa en el orden alfabético de los niveles de los factores (por ejemplo, "H", "L", "M"). Si sus tags tienen un orden convencional diferente de alfabético (es decir, "H", "M", "L"), esto puede hacer que sus gráficos parezcan extraños.

A primera vista, puede parecer que el problema se debe al orden de los datos en el dataframe, es decir, si solo pudiéramos colocar toda "H" en la parte superior y "L" en la parte inferior, entonces funcionaría. No es así Pero si desea que sus tags aparezcan en el mismo orden que la primera aparición en los datos, puede usar este formulario:

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

Esta pregunta anterior de StackOverflow muestra cómo reordenar un boxplot basado en un valor numérico; lo que necesita aquí probablemente sea simplemente un cambio de factor al tipo relacionado ordered . Pero es difícil decir que no tenemos sus datos y no proporcionó un ejemplo reproducible.

Editar Usando el conjunto de datos que publicó en variable md y confiando en la solución que mencioné anteriormente, obtenemos

 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)) 

que crea el gráfico que estabas buscando crear.

Esto también es equivalente a la otra solución presentada aquí.

Intereting Posts