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