1 Introduction

Vous savez désormais comment conserver ou supprimer des colonnes et des lignes de votre ensemble de données. Aujourd’hui, vous allez apprendre comment modifier des variables existantes ou en créer de nouvelles, en utilisant la fonction mutate() de {dplyr}. C’est une étape essentielle dans la plupart des projets d’analyse de données.

Allons-y!

Fig: la fonction mutate().
Fig: la fonction mutate().

2 Objectifs d’apprentissage

  1. Vous pouvez utiliser la fonction mutate() du package {dplyr} pour créer de nouvelles variables ou modifier des variables existantes.

  2. Vous pouvez créer de nouvelles variables numériques, caractères, facteurs et booléennes.

3 Packages

Cette leçon nécessitera les “packages” chargés ci-dessous:

if(!require(pacman)) install.packages("pacman")
pacman::p_load(here, 
               janitor,
               tidyverse)

4 Jeux de données

Dans cette leçon, nous utiliserons à nouveau les données de l’enquête sérologique COVID-19 menée à Yaoundé, au Cameroun. Ci-dessous, nous importons l’ensemble de données yaounde et créons un sous-ensemble plus petit appelé yao. Notez que cet ensemble de données est légèrement différent de celui utilisé dans la leçon précédente.

yaounde <- read_csv(here::here('data/yaounde_data.csv'))

## un sous-ensemble plus petit de variables
yao <- yaounde %>% select(date_surveyed, 
                          age, 
                          weight_kg, height_cm, 
                          symptoms, is_smoker)

yao

Nous utiliserons également un jeu de données issu d’une étude transversale visant à déterminer la prévalence de la sarcopénie chez la population âgée (>60 ans) au Karnataka, en Inde. La sarcopénie est une condition courante chez les personnes âgées, caractérisée par une perte progressive et généralisée de la masse et de la force musculaires squelettiques. Les données ont été obtenues de Zenodo ici, et la publication source peut être trouvée ici.

Ci-dessous, nous importons et visualisons cet ensemble de données :

sarcopenia <- read_csv(here::here('data/sarcopenia_elderly.csv'))

sarcopenia

Notez que le jeu de donnée COVID-19 Yaoundé et sarcopénie sont en anglais !

Pour cette leçon, nous utiliserons ces versions en anglais. Mais dans d’autres leçons, nous utiliserons des versions partialement en français.

5 Introduction à mutate()

La fonction mutate(). (Dessin adapté d’Allison Horst)
La fonction mutate(). (Dessin adapté d’Allison Horst)

Nous utilisons dplyr::mutate() pour créer de nouvelles variables ou modifier des variables existantes. La syntaxe est assez intuitive et ressemble généralement à df %>% mutate(nouveau_nom_de_colonne = ce_qu'il_contient).

Voyons un exemple rapide.

L’ensemble de données yaounde contient actuellement une colonne appelée height_cm, qui montre la taille, en centimètres, des répondants à l’enquête. Créons un dataframe, yao_height, avec juste cette colonne, pour une illustration facile :

yao_height <- yaounde %>% select(height_cm)
yao_height

Que faire si vous vouliez créer une nouvelle variable, appelée height_meters, où les hauteurs sont converties en mètres? Vous pouvez utiliser mutate() pour cela, avec l’argument height_meters = height_cm/100 :

yao_height %>% 
  mutate(height_meters = height_cm/100)

Super. La syntaxe est magnifiquement simple, n’est-ce pas?

Il est parfois utile de penser aux fonctions de manipulation de données dans le contexte d’un logiciel de tableur familier. Voici à quoi correspondrait la commande R mutate(height_m = height_cm/100) dans Google Sheets :

Maintenant, imaginez qu’il y avait une petite erreur dans l’équipement utilisé pour mesurer les hauteurs des répondants, et que toutes les hauteurs sont inférieures de 5 cm. Vous aimeriez donc ajouter 5 cm à toutes les hauteurs de l’ensemble de données. Pour ce faire, plutôt que de créer une nouvelle variable comme vous l’avez fait auparavant, vous pouvez modifier la variable existante avec mutate :

yao_height %>% 
  mutate(height_cm = height_cm + 5)

Encore une fois, très facile à faire!

La dataframe sarcopenia a une variable weight_kg, qui contient le poids des répondants en kilogrammes. Créez une nouvelle colonne, appelée weight_grams, avec le poids des répondants en grammes. Stockez votre réponse dans l’objet Q_weight_to_g. (1 kg équivant à 1000 grammes.)

# Complétez le code avec votre réponse:
Q_weight_to_g <- 
  sarcopenia %>% 
  _____________________

J’espère que vous voyez maintenant que la fonction mutate est très conviviale. En théorie, nous pourrions terminer la leçon ici, car vous savez maintenant comment utiliser mutate() 😃. Mais bien sûr, le diable est dans les détails - ce qui est intéressant, ce n’est pas mutate() lui-même mais ce qui se trouve à l’intérieur de l’appel mutate().

Le reste de la leçon traitera de quelques cas d’utilisation du verbe mutate(). Dans ce processus, nous aborderons plusieurs nouvelles fonctions que vous n’avez pas encore rencontrées.

6 Création d’une variable à partir de zéro (indice de ligne)

Souvent, vous allez créer des variables qui référencent des variables existantes (par exemple, la variable height_meters créée ci-dessus fait référence à la variable height_cm).

Parfois, vous créez des variables “à partir de zéro” sans faire référence à d’autres.

Regardons a un exemple. Nous allons créer un indice de ligne avec mutate() et 1:n() pour générer une séquence d’indices de lignes.

Le n() dans dplyr retourne le nombre de lignes du dataframe.

yao_height %>% 
  mutate(row_index = 1:n())

Ajoutez une variable respondent_id à sarcopenia pour contenir le numéro de ligne.

# Complétez le code :
Q_sarcopenia_resp_id <- 
  sarcopenia %>% 
  mutate(________________________)

Note : La base de données sarcopenia comporte 10 colonnes, qui ne tiendront probablement pas toutes dans votre console lorsque vous imprimerez cette base de données. Votre nouvelle colonne, respondent_id sera probablement cachée.

Ainsi, pour voir réellement la nouvelle colonne, vous pouvez utiliser View() pour visualiser l’ensemble du cadre de données ou select() pour sélectionner les colonnes concernées.

7 Création d’une variable booléenne

Vous pouvez utiliser mutate() pour créer une variable booléenne pour catégoriser une partie de votre population.

Ci-dessous, nous créons une variable booléenne, is_child qui est soit TRUE si le sujet est un enfant ou FALSE si le sujet est un adulte (d’abord, nous sélectionnons uniquement la variable age pour qu’il soit facile de voir ce qui est fait ; il est probable que vous n’ayez pas besoin de cette présélection pour vos propres analyses).

yao %>%
  select(age) %>%
  mutate(is_child = age <= 18)

Le code age <= 18 évalue si chaque âge est inférieur ou égal à 18. Les âges qui correspondent à cette condition (18 ans et moins) sont TRUE et ceux qui ne répondent pas à la condition sont FALSE.

Une telle variable est utile pour, par exemple, compter le nombre d’enfants dans le jeu de données. Le code ci-dessous le fait avec la fonction janitor::tabyl() :

yao %>%
  mutate(is_child = age <= 18) %>%
  tabyl(is_child)

Vous pouvez observer que 31,8% (0,318…) des répondants de l’ensemble de données sont des enfants.

Voyons un autre exemple, car le concept de variables booléennes peut être un peu déroutant. La variable symptoms rapporte tous les symptômes respiratoires ressentis par le patient :

yao %>%
  select(symptoms)

Vous pourriez créer une variable booléenne, appelée has_no_symptoms, qui est définie sur TRUE si le répondant n’a signalé aucun symptôme :

yao %>%
  select(symptoms) %>%
  mutate(has_no_symptoms = symptoms == "No symptoms")

De même, vous pourriez créer une variable booléenne appelée has_any_symptoms qui est définie sur TRUE si le répondant a signalé des symptômes. Pour cela, vous échangerez simplement le code symptoms == "No symptoms" pour symptoms != "No symptoms" :

yao %>%
  select(symptoms) %>%
  mutate(has_any_symptoms = symptoms != "No symptoms")

Toujours confus par les exemples booléens? C’est normal. Prenez une pause et jouez un peu avec le code ci-dessus. Ensuite, essayez la question de pratique ci-dessous.

Les femmes ayant une force de préhension inférieure à 20 kg sont considérées comme ayant une faible force de préhension. Avec un sous-ensemble féminin du dataframe sarcopenia, ajoutez une variable appelée low_grip_strength qui est TRUE pour les femmes avec une force de préhension < 20 kg et FALSE pour les autres femmes.

# Complétez le code avec votre réponse :
Q_women_low_grip_strength <- 
  sarcopenia %>%
  filter(sex_male_1_female_0 == 0) %>%  # d'abord, nous filtrons l'ensemble de données pour seulement les femmes
  mutate(________________________) # code mutate ici

Quel pourcentage de femmes interrogées ont une faible force de préhension selon la définition ci-dessus? Entrez votre réponse sous forme de nombre sans guillemets (par exemple, 43.3 ou 12.2), à une décimale près.

Q_prop_women_low_grip_strength <- "VOTRE RÉPONSE"

8 Création d’une variable numérique basée sur une formule

Maintenant, regardons un exemple de création d’une variable numérique, l’indice de masse corporelle (IMC), qui est un indicateur de santé couramment utilisé. La formule de l’indice de masse corporelle peut être écrite comme suit :

\[ IMC = \frac{poids (kilogrammes)}{taille (mètres)^2} \]

Vous pouvez utiliser mutate() pour calculer l’IMC dans l’ensemble de données yao comme suit :

yao %>%
  select(weight_kg,  height_cm) %>% 
  
  # d'abord obtenir la taille en mètres
  mutate(height_meters = height_cm/100) %>% 
  
  # puis utiliser la formule de l'IMC
  mutate(bmi = weight_kg / (height_meters)^2)

Sauvegardons le dataframe avec les IMC pour plus tard. Nous l’utiliserons dans la section suivante.

yao_bmi <- 
  yao %>%
  select(weight_kg,  height_cm) %>% 
  # d'abord obtenir la taille en mètres
  mutate(height_meters = height_cm/100) %>% 
  # puis utiliser la formule de l'IMC
  mutate(bmi = weight_kg / (height_meters)^2)

La masse musculaire appendiculaire (MMA), un indicateur de santé utile, est la somme de la masse musculaire dans les 4 membres. Elle peut être prédite avec la formule suivante, appelée équation de Lee :

\[MMA(kg)= (0.244 \times poids(kg)) + (7.8 \times taille(m)) + (6.6 \times sexe) - (0.098 \times âge) - 4.5\]

La variable sex dans la formule suppose que les hommes sont codés comme 1 et les femmes comme 0 (ce qui est déjà le cas pour notre ensemble de données sarcopenia). Le - 4.5 à la fin est une constante utilisée pour les Asiatiques.

Calculez la valeur MMA pour tous les individus dans l’ensemble de données sarcopenia. Cette valeur devrait être dans une nouvelle colonne appelée asm

# Complétez le code avec votre réponse:
Q_asm_calculation <- 
  sarcopenia %>% 
  mutate(asm = _______________________________________________)

9 Changer le type d’une variable

Dans votre flux de travail d’analyse de données, vous avez souvent besoin de redéfinir les types de variables. Vous pouvez le faire avec des fonctions telles que as.integer(), as.factor(), as.character() et as.Date() dans votre appel mutate(). Voyons un exemple de cela.

9.1 Entier : as.integer

as.integer() convertit toutes les valeurs numériques en entiers :

yao_bmi %>% 
  mutate(bmi_integer = as.integer(bmi))

Notez que cela tronque les entiers plutôt que de les arrondir vers le haut ou le bas, comme vous pourriez vous y attendre. Par exemple, le BMI 22.8 à la troisième ligne est tronqué à 22. Si vous voulez des nombres arrondis, vous pouvez utiliser la fonction round de base R.

Utiliser as.integer() sur une variable factorielle est un moyen rapide de codifier des chaînes en nombres. Cela peut être essentiel pour certains traitements de données d’apprentissage automatique.

yao_bmi %>% 
  mutate(bmi_integer = as.integer(bmi), 
         bmi_rounded = round(bmi)) 

La fonction round() de base R arrondit “à la moitié vers le bas”. C’est-à-dire que le nombre 3.5, par exemple, est arrondi à 3 par round(). C’est étrange. La plupart des gens s’attendent à ce que 3.5 soit arrondi vers le haut à 4, et non pas vers le bas à 3. La plupart du temps, vous voudrez donc utiliser la fonction round_half_up() de janitor.

Dans les leçons futures, vous découvrirez comment manipuler les dates et comment convertir en un type de date en utilisant as.Date().

Utilisez as_integer() pour convertir les âges des répondants dans l’ensemble de données sarcopenia en entiers (en les tronquant au passage). Cela devrait aller dans une nouvelle colonne appelée age_integer.

# Complétez le code avec votre réponse :
Q_age_integer <- 
  sarcopenia %>% 
  mutate(age_integer =  ________________________)

10 En Résumé !

Comme vous pouvez l’imaginer, transformer des données est une étape essentielle dans tout flux de travail d’analyse de données. Il est souvent nécessaire de nettoyer les données et de les préparer pour d’autres analyses statistiques ou pour créer des graphiques. Et comme vous l’avez vu, il est assez simple de transformer des données avec la fonction mutate() de dplyr, bien que certaines transformations soient plus délicates à réaliser que d’autres.

Félicitations d’être arrivé jusqu’ici.

Mais votre périple de manipulation de données n’est pas encore terminé ! Dans nos prochaines leçons, nous apprendrons à créer des résumés de données complexes et comment créer et travailler avec des groupes de data frame. Intrigué ? À bientôt dans la prochaine leçon.

Fig : Manipulation basique des données avec select(), filter(), et mutate().
Fig : Manipulation basique des données avec select(), filter(), et mutate().

Contributeurs

Les membres de l’équipe suivants ont contribué à cette leçon :

Références

Certains matériaux de cette leçon ont été adaptés des sources suivantes :

Les illustrations ont été adaptées de :

Autres références :

  • Lee, Robert C, ZiMian Wang, Moonseong Heo, Robert Ross, Ian Janssen, et Steven B Heymsfield. “Total-Body Skeletal Muscle Mass: Development and Cross-Validation of Anthropometric Prediction Models.” The American Journal of Clinical Nutrition 72, no. 3 (2000): 796–803. https://doi.org/10.1093/ajcn/72.3.796.