1 Introduction

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 ! Fig: le verbe filter().

2 Objectifs d’apprentissage

  1. Vous pouvez utiliser dplyr::filter() pour conserver ou supprimer des lignes d’un dataframe.
  2. Vous pouvez filtrer les lignes en spécifiant des conditions sur des nombres ou des chaînes en utilisant des opérateurs relationnels comme supérieur à (>), inférieur à (<), égal à (==), et différent de (!=).
  3. Vous pouvez filtrer les lignes en combinant des conditions avec des opérateurs logiques comme le esperluette (&) et la barre verticale (|).
  4. Vous pouvez filtrer les lignes en négatif des conditions avec l’opérateur logique point d’exclamation (!).
  5. Vous pouvez filtrer les lignes avec des valeurs manquantes en utilisant la fonction is.na().

3 L’ensemble de données COVID-19 de Yaoundé

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)
yao

Notez 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.

4 Introduction à 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 :

yao %>% filter(sex == "Male")

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.

# combien de répondants étaient des hommes?
yao %>% 
  filter(sex == "Male") %>% 
  nrow()
## [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())

5 Opérateurs relationnels

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
Fig: Opérateurs AND et OR visualisés.
Fig: Opérateurs AND et OR visualisés.

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”.

6 Combiner des conditions avec & 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 ligne

Lorsque 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.

7 Négation des conditions avec !

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 :

# supprimer les répondants < 18 ans OU < 30 kg
yao %>% filter(!(age < 18 | weight_kg < 30))

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”.

yao %>% filter(age < 18 | weight_kg < 30)

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”.

yao %>% filter(!(age < 18 | weight_kg < 30))

Dans yao, supprimez les répondants qui vivent dans les quartiers Tsinga ou Messa.

8 Valeurs NA

Les 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_mini

Dans 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.

yao_mini %>% filter(is_pregnant == NA) # ne fonctionne pas
yao_mini %>% filter(is_pregnant == "NA") # ne fonctionne 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 :

# garde les lignes où `is_pregnant` est NA
yao_mini %>% filter(is.na(is_pregnant)) 

Cette fonction peut être niée avec ! :

# supprime les lignes où `is_pregnant` est NA
yao_mini %>% filter(!is.na(is_pregnant))

Pour les tibbles, RStudio mettra en évidence les valeurs NA en rouge vif pour les distinguer des autres valeurs :

Une erreur courante avec NA
Une erreur courante avec NA

Les 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.

En Résumé !

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 !

Fig: Manipulation de données de base : select() et filter().
Fig: Manipulation de données de base : select() et filter().

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 œuvres d’art ont été adaptées de :