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!
mutate().Vous pouvez utiliser la fonction mutate() du package
{dplyr} pour créer de nouvelles variables ou modifier des
variables existantes.
Vous pouvez créer de nouvelles variables numériques, caractères, facteurs et booléennes.
Cette leçon nécessitera les “packages” chargés ci-dessous:
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)
yaoNous 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 :
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.
mutate()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 :
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
:
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 :
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.)
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.
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.
Ajoutez une variable respondent_id à
sarcopenia pour contenir le numéro de ligne.
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.
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).
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() :
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 :
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 :
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" :
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 iciQuel 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.
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
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.
as.integeras.integer() convertit toutes les valeurs numériques en
entiers :
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.
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.
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.
select(), filter(), et
mutate().Les membres de l’équipe suivants ont contribué à cette leçon :
Certains matériaux de cette leçon ont été adaptés des sources suivantes :
Horst, A. (2022). Dplyr-learnr. https://github.com/allisonhorst/dplyr-learnr (Travail original publié en 2020)
Créer, modifier, et supprimer des colonnes — Mutate. (n.d.). Consulté le 21 février 2022, à partir de https://dplyr.tidyverse.org/reference/mutate.html
Appliquer une fonction (ou des fonctions) sur plusieurs colonnes — Across. (n.d.). Consulté le 21 février 2022, à partir de https://dplyr.tidyverse.org/reference/across.html
Les illustrations ont été adaptées de :
Autres références :