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),] )) )
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.
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)
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)