2010-09-22 7 views
30

Me gustaría usar R para hacer una serie de diagramas de caja que están ordenados por valor mediano. Supongamos entonces ejecuto:Ordenando un diagrama de caja basado en el valor mediano

boxplot(cost ~ type) 

Esto me daría algunos diagramas de caja fueron costos se muestra en el eje Y y la categoría tipo es visible en el eje x:

-----  ----- 
    |   | 
[ ]  | 
    |  [ ] 
    |   | 
-----  ----- 
    A   B 

Sin embargo, lo que yo' d es como las figuras de boxplot ordenadas del valor mediano más alto al más bajo. Mi sospecha es que lo que tengo que hacer es cambiar las etiquetas del tipo (A o B) para indicar numéricamente cuál es el valor mediano más bajo y más alto, pero me pregunto si hay una forma más inteligente de resolver el problema.

Respuesta

44

Echa un vistazo ?reorder. El ejemplo parece ser lo que quieres, pero ordenado en el orden opuesto. Cambié -count en la primera línea a continuación para ordenar en el orden que desee.

bymedian <- with(InsectSprays, reorder(spray, -count, median)) 
    boxplot(count ~ bymedian, data = InsectSprays, 
      xlab = "Type of spray", ylab = "Insect count", 
      main = "InsectSprays data", varwidth = TRUE, 
      col = "lightgray") 
10

Sí, esa es la idea:

> set.seed(42)      # fix seed  
> DF <- data.frame(type=sample(LETTERS[1:5], 100, replace=TRUE), 
+     cost=rnorm(100)) 
> 
> boxplot(cost ~ type, data=DF) # not ordered by median 
> 
> # compute index of ordered 'cost factor' and reassign   
> oind <- order(as.numeric(by(DF$cost, DF$type, median)))  
> DF$type <- ordered(DF$type, levels=levels(DF$type)[oind]) 
> 
> boxplot(cost ~ type, data=DF) # now it is ordered by median 
0

Cuidado con los valores que faltan, hay que añadir na.rm = TRUE para que funcione. Si no, el código simplemente no funciona. Me llevó horas encontrarlo.

bymedian <- with(InsectSprays, reorder(spray, -count, median, **na.rm = TRUE**) 
    boxplot(count ~ bymedian, data = InsectSprays, 
      xlab = "Type of spray", ylab = "Insect count", 
      main = "InsectSprays data", varwidth = TRUE, 
      col = "lightgray") 
+1

Debe especificar que esto se refiere a [la respuesta de Joshua Ulrich] (http://stackoverflow.com/a/3766007/3982001). En realidad, debería ser un comentario, pero también puede ser independiente como una respuesta separada. –

+0

Lo señalé como "no una respuesta", ya que se publica (y acepta) la misma respuesta exacta. El usuario acaba de agregar un nuevo argumento. Esto no mejora la calidad de la solución y no es suficiente para ser una respuesta separada. – PoGibas

Cuestiones relacionadas