Dplyr : Comment muter une variable si la colonne contient une chaîne



Vous pouvez utiliser la syntaxe de base suivante dans dplyr pour muter une variable si une colonne contient une chaîne particulière :

library(dplyr)

df %>% mutate_at(vars(contains('starter')), ~ (scale(.) %>% as.vector))

Cette syntaxe particulière applique la fonction scale() à chaque variable du bloc de données qui contient la chaîne « starter » dans le nom de la colonne.

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

Exemple : muter la variable si la colonne contient une chaîne

Supposons que nous ayons le bloc de données suivant dans R :

#create data frame
df <- data.frame(team=c('A', 'B', 'C', 'D', 'E', 'F'),
                 starter_points=c(22, 26, 25, 13, 15, 22),
                 starter_assists=c(4, 5, 10, 14, 12, 10),
                 bench_points=c(7, 7, 9, 14, 13, 10),
                 bench_assists=c(2, 5, 5, 4, 9, 14))

#view data frame
df

  team starter_points starter_assists bench_points bench_assists
1    A             22               4            7             2
2    B             26               5            7             5
3    C             25              10            9             5
4    D             13              14           14             4
5    E             15              12           13             9
6    F             22              10           10            14

Nous pouvons utiliser la syntaxe suivante pour appliquer la fonction scale() à chaque variable du bloc de données qui contient la chaîne « starter » dans le nom de la colonne.

library(dplyr)

#apply scale() function to each variable that contains 'starter' in the name
df %>% mutate_at(vars(contains('starter')), ~ (scale(.) %>% as.vector))

  team starter_points starter_assists bench_points bench_assists
1    A      0.2819668      -1.3180158            7             2
2    B      1.0338784      -1.0629159            7             5
3    C      0.8459005       0.2125832            9             5
4    D     -1.4098342       1.2329825           14             4
5    E     -1.0338784       0.7227828           13             9
6    F      0.2819668       0.2125832           10            14

En utilisant cette syntaxe, nous avons pu appliquer la fonction scale() pour mettre à l’échelle chaque colonne contenant « starter » de telle sorte que leurs valeurs aient désormais une moyenne de 0 et un écart type de 1.

Notez que les colonnes suivantes ont été modifiées :

  • starter_points
  • starter_assistes

Toutes les autres colonnes sont restées inchangées.

Notez également que nous pouvons appliquer n’importe quelle fonction que nous souhaitons en utilisant cette syntaxe.

Dans l’exemple précédent, nous avons choisi de mettre à l’échelle chaque colonne avec la chaîne « starter » dans le nom.

Cependant, nous pourrions faire quelque chose de plus simple, comme multiplier les valeurs par deux pour chaque colonne avec « starter » dans le nom :

library(dplyr)

#multiply values by two for each variable that contains 'starter' in the name
df %>% mutate_at(vars(contains('starter')), ~ (. * 2))

  team starter_points starter_assists bench_points bench_assists
1    A             44               8            7             2
2    B             52              10            7             5
3    C             50              20            9             5
4    D             26              28           14             4
5    E             30              24           13             9
6    F             44              20           10            14

Notez que les valeurs des colonnes starter_points et starter_assistes ont été multipliées par deux, tandis que toutes les autres colonnes sont restées inchangées.

Ressources additionnelles

Les didacticiels suivants expliquent comment effectuer d’autres tâches courantes dans dplyr :

Comment supprimer des lignes à l’aide de dplyr
Comment sélectionner des colonnes par index à l’aide de dplyr
Comment filtrer les lignes contenant une certaine chaîne à l’aide de dplyr

Ajouter un commentaire

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