J'aimerais utiliser R pour créer une série de boîtes à moustaches triées par valeur médiane. Supposons alors que j'exécute:
boxplot(cost ~ type)
Cela me donnerait quelques boîtes à moustaches où le coût est indiqué sur l'axe des y et la catégorie type est visible sur l'axe des x:
----- -----
| |
[ ] |
| [ ]
| |
----- -----
A B
Cependant, ce que je voudrais, ce sont les chiffres de la boîte à moustaches, classés du plus haut au plus bas médian. Je soupçonne que ce que je dois faire est de changer les étiquettes du type (A ou B) pour indiquer numériquement quelle est la valeur médiane la plus basse et la plus haute, mais je me demande s’il existe un moyen plus intelligent de résoudre le problème.
Découvrez ?reorder
. L'exemple semble être ce que vous voulez, mais trié dans l'ordre inverse. J'ai changé -count
dans la première ligne ci-dessous pour trier dans l'ordre que vous voulez.
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")
Oui, c'est l'idée:
> 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
Attention aux valeurs manquantes, vous devez ajouter na.rm = TRUE
pour que cela fonctionne. Sinon, le code ne fonctionne tout simplement pas. Cela m'a pris des heures pour le découvrir.
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")