Ordenar una gráfica de caja basada en el valor mediano


Me gustaría usar R para hacer una serie de diagramas de caja que se ordenan por valor mediano. Supongamos entonces que ejecutamos:

boxplot(cost ~ type)

Esto me daría algunas gráficas de caja donde el costo se muestra en el eje y y la categoría de tipo es visible en el eje x:

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

Sin embargo, lo que me gustaría es que las cifras de boxplot ordenadas de mayor a menor valor mediano. 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 la mediana más baja y más alta valor, pero me pregunto si hay una manera más inteligente de resolver el problema.

 31
Author: zx8754, 2010-09-22

3 answers

Echa un vistazo a ?reorder. El ejemplo parece ser lo que quieres, pero ordenado en el orden opuesto. Cambié -count en la primera línea de abajo 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")
 45
Author: Joshua Ulrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-22 02:54:09

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
 12
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-22 02:54:36

Tenga cuidado con los valores que faltan, debe agregar na.rm = TRUE para que funcione. Si no, el código simplemente no funciona. Me llevó horas averiguarlo.

  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")
 0
Author: Wouter Bollaert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 22:30:24