web-dev-qa-db-fra.com

R, dplyr - la combinaison de group_by () et arrange () ne produit pas le résultat attendu?

lors de l'utilisation de la fonction dplyr group_by() et immédiatement après arrange(), je m'attendrais à obtenir une sortie où la trame de données est ordonnée dans groupes que j'ai indiqués dans group_by(). Ma lecture de la documentation est que cette combinaison devrait produire un tel résultat, cependant quand je l'ai essayé ce n'est pas ce que j'obtiens, et googler n'a pas indiqué que d'autres personnes ont rencontré le même problème. Ai-je tort d'attendre ce résultat?

Voici un exemple, en utilisant le jeu de données intégré R ToothGrowth:

library(dplyr)
ToothGrowth %>%
  group_by(supp) %>%
  arrange(len)

L'exécution de ceci produira une trame de données où la trame de données entière est ordonnée selon len et non dans les facteurs supp.

C'est le code qui produit la sortie souhaitée:

ToothGrowth %>%
  group_by(supp) %>%
  do( data.frame(with(data=., .[order(len),] )) )
33
Hrvoje

Je pense que tu veux

ToothGrowth %>%
  arrange(supp,len)

Le système de chaînage remplace simplement les commandes imbriquées, vous devez donc d'abord regrouper, puis ordonner ce résultat groupé, ce qui rompt l'ordre d'origine.

10
JeremyS

Vous pouvez produire le comportement attendu en définissant .by_group = TRUE dans arrange:

library(dplyr)
ToothGrowth %>%
    group_by(supp) %>%
    arrange(len, .by_group = TRUE)
32
David Rubinger

Une autre façon de résoudre ce problème d'ordre inattendu tout en utilisant l'instruction group_by() consiste à convertir le grouped_df retour à un data frame. group_by est nécessaire pour les résumés par exemple:

ToothGrowthMeanLen <-  ToothGrowth %>%
    group_by(supp, dose) %>%
    summarise(meanlen = mean(len)) 

Ce tableau récapitulatif n'est pas organisé dans l'ordre des moyennes

ToothGrowthMeanLen %>%
    arrange(meanlen)

Ce tableau récapitulatif est organisé dans l'ordre des moyennes

ToothGrowthMeanLen %>%
    data.frame() %>%   # Convert to a simple data frame
    arrange(meanlen)

Conversion grouped_df revenir à un bloc de données est la première façon que j'ai trouvée pour trier un data.frame résumé. Mais en fait dplyr::ungroup existe à cet effet.

ToothGrowthMeanLen %>%
    ungroup() %>%   # Remove grouping
    arrange(meanlen)
2
Paul Rougieux