Comment regrouper par toutes les colonnes sauf une dans dplyr



Vous pouvez utiliser la syntaxe de base suivante pour regrouper toutes les colonnes sauf une dans un bloc de données à l’aide du package dplyr dans R :

df %>%
  group_by(across(c(-this_column)))

Cet exemple particulier regroupe le bloc de données par toutes les colonnes sauf celle appelée this_column .

Notez que le signe négatif ( ) dans la formule indique à dplyr d’exclure cette colonne particulière dans la fonction group_by() .

L’exemple suivant montre comment utiliser cette syntaxe dans la pratique.

Exemple : regrouper par toutes les colonnes sauf une dans dplyr

Supposons que nous ayons le bloc de données suivant dans R qui contient des informations sur divers joueurs de basket-ball :

#create data frame
df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'),
                 position=c('G', 'G', 'F', 'F', 'G', 'G', 'F', 'F'),
                 starter=c('Y', 'Y', 'Y', 'N', 'Y', 'N', 'N', 'N'),
                 points=c(99, 104, 119, 113))

#view data frame
df

  team position starter points
1    A        G       Y     99
2    A        G       Y    104
3    A        F       Y    119
4    A        F       N    113
5    B        G       Y     99
6    B        G       N    104
7    B        F       N    119
8    B        F       N    113

Supposons maintenant que nous souhaitions trouver la valeur maximale dans la colonne des points , regroupée dans toutes les autres colonnes du bloc de données.

Nous pouvons utiliser la syntaxe suivante pour ce faire :

library(dplyr)

#group by all columns except points column and find max points
df %>%
  group_by(across(c(-points))) %>%
  mutate(max_points = max(points))

# A tibble: 8 x 5
# Groups:   team, position, starter [6]
  team  position starter points max_points
                 
1 A     G        Y           99        104
2 A     G        Y          104        104
3 A     F        Y          119        119
4 A     F        N          113        113
5 B     G        Y           99         99
6 B     G        N          104        104
7 B     F        N          119        119
8 B     F        N          113        119

À partir du résultat, nous pouvons voir :

  • La valeur maximale de points pour tous les joueurs ayant une valeur d’équipe de A, une valeur de position de G et une valeur de départ de Y était de 104 .
  • La valeur maximale de points pour tous les joueurs ayant une valeur d’équipe de A, une valeur de position de F et une valeur de départ de Y était de 119 .
  • La valeur maximale de points pour tous les joueurs ayant une valeur d’équipe de A, une valeur de position de F et une valeur de départ de N était de 113 .

Et ainsi de suite.

Notez que nous pourrions également obtenir le même résultat si nous tapions chaque nom de colonne, à l’exception des points dans la fonction group_by() :

library(dplyr)

#group by all columns except points column and find max points
df %>%
  group_by(across(c(team, position, starter))) %>%
  mutate(max_points = max(points))

# A tibble: 8 x 5
# Groups:   team, position, starter [6]
  team  position starter points max_points
                 
1 A     G        Y           99        104
2 A     G        Y          104        104
3 A     F        Y          119        119
4 A     F        N          113        113
5 B     G        Y           99         99
6 B     G        N          104        104
7 B     F        N          119        119
8 B     F        N          113        119

Cela correspond au résultat de l’exemple précédent.

Cependant, notez qu’il est beaucoup plus facile d’exclure la colonne de points dans la fonction group_by() plutôt que de taper le nom de toutes les autres colonnes.

Ressources additionnelles

Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes à l’aide de dplyr :

Comment filtrer les lignes contenant une certaine chaîne à l’aide de dplyr
Comment calculer les fréquences relatives à l’aide de dplyr
Comment sélectionner la première ligne par groupe à l’aide de dplyr

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *