Filtrer des lignes avec filter()
La fonction filter() sert à filtrer des lignes, c'est-à-dire à conserver celles qui satisfont un ou plusieurs critères. Pour construire ces critères, vous pouvez utiliser différents opérateurs, présentés ci-dessous. Comme dans le chapitre précédent, les données mpg servent à illustrer la fonction. Chargez tidyverse (qui contient dplyr et les données mpg).
library(tidyverse)Voici différents exemples d'utilisation de filter().
Exemple : conserver toutes les lignes dont la variable displ vaut au moins 2 :
mpg |> filter(displ >= 2)## A tibble: 212 × 11
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
audi a4 2 2008 4 manual(m6) f 20 31 p compact
audi a4 2 2008 4 auto(av) f 21 30 p compact
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
audi a4 3.1 2008 6 auto(av) f 18 27 p compact
## Sortie tronquéeExemple : conserver toutes les lignes dont displ vaut au moins 2, dont class est "compact" et dont cyl est supérieur à la moyenne de cyl :
mpg |> filter(displ >= 2 & class =="compact" & cyl > mean(cyl))## A tibble: 13 × 11
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
audi a4 3.1 2008 6 auto(av) f 18 27 p compact
audi a4 quattro 2.8 1999 6 auto(l5) 4 15 25 p compact
audi a4 quattro 2.8 1999 6 manual(m5) 4 17 25 p compact
## Sortie tronquéefilter() peut être combinée avec group_by() pour filtrer séparément au sein de chaque groupe. C'est très utile lorsqu'une condition doit varier d'un groupe à l'autre. Supposons par exemple que nous voulions conserver toutes les lignes où cyl est supérieur à la moyenne de cyl au sein de chaque constructeur automobile (la variable manufacturer désigne le constructeur) :
mpg |>
group_by(manufacturer) |>
filter(cyl > mean(cyl))## A tibble: 109 × 11
## Groups: manufacturer [11]
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
audi a4 3.1 2008 6 auto(av) f 18 27 p compact
audi a4 quattro 2.8 1999 6 auto(l5) 4 15 25 p compact
audi a4 quattro 2.8 1999 6 manual(m5) 4 17 25 p compact
## Sortie tronquéeFiltrer en spécifiant les valeurs manquantes (NA)
Les observations qui présentent une valeur manquante pour une variable intervenant dans un critère de filter() ne seront pas évaluées et ne peuvent donc pas être conservées. Une valeur manquante se note NA (Not Available). Créons des données d'exercice pour montrer comment spécifier les valeurs manquantes dans filter(). Nous créons les données avec la fonction tibble(), qui permet de créer des data frames :
## Créer les données
my_data <- tibble(Var1 = c(NA, 5, 9),
Var2 = c(1, NA, 3),
Var3 = c("Ja", "Nej", NA))
## Afficher les données
my_data Var1 Var2 Var3
NA 1 Ja
5 NA Nej
9 3 NAChaque ligne contient un NA. Essayons maintenant de filtrer avec une condition portant sur chaque variable :
my_data |> filter(Var1>4, Var2<10, Var3=="Ja")## A tibble: 0 × 3Comme on le voit ci-dessus, il ne reste aucune ligne ! En effet, la première observation n'a pas d'information (NA) pour Var1, ce qui l'exclut. Le deuxième patient n'a pas d'information pour Var2, ce qui exclut l'observation. La troisième observation n'a pas d'information pour Var3, ce qui l'exclut également, de sorte qu'il ne reste aucune observation.
Pour résoudre ce problème, il existe la fonction is.na(). Elle s'utilise de la manière suivante :
is.na()demande si une valeur est manquante. Si la valeur est manquante, la condition est remplie.!is.na()demande si une valeur n'est pas manquante, c'est-à-dire si la valeur existe. L'opérateur!signifie « le contraire » ou « non » dans R. La condition!is.na()signifie donc « n'est pas manquante ».
Dans l'exemple suivant, nous conservons les lignes où Var1 est supérieur à 6 ou manquant. Dans R, | sert à exprimer « ou ». Le code est le suivant :
my_data |> filter(Var1>6 | is.na(Var1)) Var1 Var2 Var3
NA 1 Ja
9 3 NAFiltrer sur un intervalle numérique
Un intervalle numérique peut être spécifié avec %in%, qui se lit « dans ». Voici deux exemples qui conservent toutes les lignes où Var1 prend l'une des valeurs 0, 1, 2, 3, 4, 5, 6. Dans le premier exemple, %in% est combiné avec : et, dans le second, avec c().
## Exemple 1
my_data |> filter(Var1 %in% 0:6)
## Exemple 2
my_data |> filter(Var1 %in% c(0, 1, 2, 3, 4, 5, 6)) Var1 Var2 Var3
5 NA NejFiltrer sur un intervalle catégoriel
Un intervalle catégoriel peut également être spécifié avec %in%. Ici, nous conservons toutes les lignes où Var3 est égal à "Ja" ou à "Nej" :
my_data |> filter(Var3 %in% c("Ja", "Nej")) Var1 Var2 Var3
NA 1 Ja
5 NA Nej