Poursuivons avec le package {dplyr}, en découvrant le verbe
filter. La dernière fois, nous avons vu comment
select selectionne des variables (colonnes) et aujourd’hui
nous verrons comment conserver ou supprimer des entrées de données, des
lignes, en utilisant filter. Supprimer des entrées de
données anormales ou conserver des sous-ensembles de vos points de
données est un autre aspect essentiel de la manipulation des
données.
Allons-y !
dplyr::filter() pour conserver ou
supprimer des lignes d’un dataframe.>), inférieur à (<), égal à
(==), et différent de (!=).&) et la
barre verticale (|).!).is.na().Dans cette leçon, nous utiliserons à nouveau les données de l’enquête sérologique COVID-19 réalisée à Yaoundé, au Cameroun.
yaounde <- read_csv(here::here('data/yaounde_data.csv'))
# un sous-ensemble plus petit de variables
yao <- yaounde %>%
select(age, sex, weight_kg, highest_education, neighborhood,
occupation, is_smoker, is_pregnant,
igg_result, igm_result)
yaoNotez que le jeu de donnée COVID-19 Yaoundé est en anglais !
Pour cette leçon, nous utiliserons cette version en anglais. Mais dans d’autres leçons, nous utiliserons une version partialement en français.
filter()Nous utilisons filter() pour conserver les lignes qui
satisfont à un ensemble de conditions. Prenons un exemple simple. Si
nous voulons conserver uniquement les enregistrements masculins, nous
exécutons :
Notez l’utilisation du double signe égal == plutôt que
le signe égal simple =. Le signe == teste
l’égalité, comme le montre l’exemple ci-dessous :
# créer l'objet `sex_vector` avec trois éléments
sex_vector <- c("Male", "Female", "Female")
# tester quels éléments sont égaux à "Male"
sex_vector == "Male"## [1] TRUE FALSE FALSE
Donc le code yao %>% filter(sex == "Male") conservera
toutes les lignes où le test d’égalité sex == "Male" évalue
à TRUE.
Il est souvent utile de chaîner filter() avec
nrow() pour obtenir le nombre de lignes remplissant une
condition.
## [1] 422
Le double signe égal, ==, teste l’égalité, tandis que le
signe égal simple, =, est utilisé pour spécifier des
valeurs aux arguments à l’intérieur des fonctions.
Filtrez le dataframe yao pour sélectionner les
répondants qui étaient enceintes lors de l’enquête.
Combien de répondants étaient des femmes? (Utilisez
filter() et nrow())
L’opérateur == introduit ci-dessus est un exemple d’un
opérateur “relationnel”, car il teste la relation entre deux valeurs.
Voici une liste de certains de ces opérateurs :
| Opérateur | est VRAI si |
| A < B | A est inférieur à B |
| A <= B | A est inférieur ou égal à B |
| A > B | A est supérieur à B |
| A >= B | A est supérieur ou égal à B |
| A == B | A est égal à B |
| A != B | A est différent de B |
| A %in% B | A est un élément de B |
Voyons comment les utiliser avec filter() :
yao %>% filter(____________) ## gardez les lignes où `sex` n'est pas "Male"
yao %>% filter(____________) ## gardez les répondants de moins de 6 ans
yao %>% filter(____________) ## gardez les répondants âgés d'au moins 70 ans
# gardez les répondants dont le niveau d'éducation le plus élevé est "Primary" ou "Secondary"
yao %>% filter(___________________________________)De yao, conservez uniquement les répondants qui étaient
des enfants (moins de 18 ans).
Avec %in%, conservez uniquement les répondants qui
vivent dans les quartiers “Tsinga” ou “Messa”.
& et |Nous pouvons passer plusieurs conditions à une seule instruction
filter() séparées par des virgules:
# conserver les répondants qui sont enceintes et qui sont d'anciens fumeurs
yao %>% filter(is_pregnant == "Yes", is_smoker == "Ex-smoker") ## seulement une ligneLorsque plusieurs conditions sont séparées par une virgule, elles
sont implicitement combinées avec un et
(&).
Il est préférable de remplacer la virgule par & pour
rendre cela plus explicite.
# même résultat qu'auparavant, mais `&` est plus explicite
yao %>% filter(is_pregnant == "Yes" & is_smoker == "Ex-smoker")Ne confondez pas :
la “,” pour lister plusieurs conditions dans filter
filter(A,B) c’est-à-dire filtrer sur la condition A et
(&) la condition B
la “,” dans les listes c(A,B) qui énumère différents
composants de la liste (et n’a rien à voir avec l’opérateur
&)
Si nous voulons combiner des conditions avec un ou,
nous utilisons le symbole de la barre verticale, |.
# répondants qui sont enceintes OU qui sont d'anciens fumeurs
yao %>% filter(is_pregnant == "Yes" | is_smoker == "Ex-smoker")Filtrez yao pour ne conserver que les hommes qui ont été
testés positifs pour les IgG.
Filtrez yao pour conserver à la fois les enfants (moins
de 18 ans) et toute personne dont le niveau d’éducation le plus élevé
est l’école primaire.
!Pour nier les conditions, nous les enveloppons dans
!().
Ci-dessous, nous supprimons les répondants qui sont des enfants (moins de 18 ans) ou qui pèsent moins de 30 kg :
L’opérateur ! est également utilisé pour nier
%in% car R n’a pas d’opérateur pour NOT
in.
# supprimer les répondants dont le niveau d'éducation le plus élevé n'est PAS "Primaire" ou "Secondaire"
yao %>% filter(!(highest_education %in% c("Primary", "Secondary")))Il est plus facile de lire les instructions filter()
comme des instructions conserver, pour éviter toute
confusion sur le fait de savoir si nous filtrons dans
ou filtrons hors!
Ainsi, le code ci-dessous se lirait : “conserver les répondants qui ont moins de 18 ans ou qui pèsent moins de 30 kg”.
Et lorsque nous enveloppons des conditions dans !(),
nous pouvons alors lire les instructions filter() comme des
instructions supprimer.
Ainsi, le code ci-dessous se lirait : “supprimer les répondants qui ont moins de 18 ans ou qui pèsent moins de 30 kg”.
Dans yao, supprimez les répondants qui vivent dans les
quartiers Tsinga ou Messa.
NALes opérateurs relationnels introduits jusqu’à présent ne
fonctionnent pas avec NA.
Créons un sous-ensemble de données pour illustrer cela.
yao_mini <- yao %>%
select(sex, is_pregnant) %>%
slice(1,11,50,2) # ordre de ligne personnalisé
yao_miniDans yao_mini, le dernier répondant a une valeur
NA pour la colonne is_pregnant car il est un
homme.
Essayer de sélectionner cette ligne en utilisant == NA
ne fonctionnera pas.
C’est parce que NA est une valeur inexistante. Ainsi, R
ne peut pas évaluer si elle est “équivalente à” ou “différente de” quoi
que ce soit.
La fonction spéciale is.na() est donc nécessaire :
Cette fonction peut être niée avec ! :
Pour les tibbles, RStudio mettra en évidence les valeurs
NA en rouge vif pour les distinguer des autres valeurs
:
NALes valeurs NA peuvent être identifiées, mais toute
autre codification telle que "NA" ou "NaN",
qui sont codées comme des chaînes, sera imperceptible pour les fonctions
(ce sont des chaînes, comme toutes les autres).
Dans l’ensemble de données yao, conservez tous les
répondants qui avaient des dossiers manquants concernant le signalement
de leur statut de fumeur.
Pour certains répondants, la fréquence respiratoire, en respirations
par minute, a été enregistrée dans la colonne
respiration_frequency.
Dans yaounde, éliminez ceux ayant une fréquence
respiratoire inférieure à 20. Pensez aux NAs lors de cette opération !
Vous devriez également éviter de supprimer les valeurs NA.
Maintenant, vous connaissez les deux verbes essentiels pour
sélectionner (select()) les colonnes et filtrer
(filter()) les lignes. De cette manière, vous conservez les
variables qui vous intéressent en sélectionnant vos colonnes et vous
conservez les entrées de données que vous jugez pertinentes en filtrant
vos lignes.
Mais qu’en est-il de la modification, de la transformation de vos données ? Nous en apprendrons davantage à ce sujet dans la prochaine leçon. À bientôt !
select() et filter().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. (2021). Dplyr-learnr. https://github.com/allisonhorst/dplyr-learnr (Œuvre originale publiée en 2020)
Sélectionner des lignes en utilisant les valeurs des colonnes—Filter. (n.d.). Consulté le 12 janvier 2022, à partir de https://dplyr.tidyverse.org/reference/filter.html
Les œuvres d’art ont été adaptées de :