web-dev-qa-db-fra.com

Tri d'une boîte à moustaches en fonction de la valeur médiane

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.

32
speciousfool

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")
47
Joshua Ulrich

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
12
Dirk Eddelbuettel

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")
0
Wouter Bollaert