Cela devrait probablement être facile, mais je suis incapable de trouver la réponse par moi-même.

Prenons par exemple le jeu de données sur l'iris, je souhaite obtenir la largeur maximale des pétales pour chaque espèce, en utilisant cette requête :

iris %>% group_by(Species) %>% summarise(max(Petal.Width))

Ce qui renvoie le résultat suivant:

# A tibble: 3 x 2
  Species    `max(Petal.Width)`
  <fct>                   <dbl>
1 setosa                    0.6
2 versicolor                1.8
3 virginica                 2.5

Maintenant, je veux connaître la longueur des pétales de chacune de ces rangées avec des valeurs maximales de largeur de pétale.[1] Comment ferais-je pour faire ça ? Une sélection ne fonctionne pas :

iris %>% group_by(Species) %>% select(Species,Petal.Length,Petal.Width) %>% summarise(max_val = max(Petal.Width))

Parce que je ne comprends pas l'attribut de longueur de pétale est toujours manquant avec cela.

1: Par exemple, la rangée où la largeur des pétales est de 1,8 et l'espèce est versicolor, la longueur des pétales est de 4,8 - et j'aimerais avoir cette information avec le résultat.

0
mre 2 nov. 2020 à 23:33

1 réponse

Meilleure réponse

Considérez summarize comme une agrégation de lignes - en les combinant. Il fonctionne avec des fonctions telles que mean, max, n_distinct, qui donnent un résumé numérique unique d'une colonne.

max est en quelque sorte un cas particulier - il s'agit d'une fonction récapitulative à un seul nombre, mais elle ne combine pas réellement les valeurs. Dans ce cas, vous ne voulez pas trouver le maximum, vous voulez trouver la ligne avec la valeur maximum. Garder une ligne particulière est une opération filter, pas une opération summarize, nous pouvons donc le faire de différentes manières.

## keep the row(s) with the maximum Petal Width
iris %>% 
  group_by(species) %>%
  filter(Petal.Width == max(Petal.Width))  

## sort by petal width and keep top row in each group
iris %>% 
  group_by(Species) %>%
  ## order the data by descending `Petal.Width`
  arrange(desc(Petal.Width)) %>%
  ## keep the top row
  slice(1)

## use the built-in function for this particular case!
iris %>%
  group_by(Species) %>%
  slice_max(Petal.Width)

Ce sont fondamentalement les mêmes - ils différeront s'il y a des liens pour la rangée avec la largeur de pétale maximale - la méthode slice(1) ne gardera qu'une seule rangée, le Petal.Width == max(Petal.Width) gardera toutes les rangées liées pour le max, et la méthode slice_max vous permettra de choisir en utilisant l'argument with_ties (par défaut, toutes les lignes liées sont conservées).

1
Gregor Thomas 2 nov. 2020 à 20:48