Dplyr filter() : filtrer les lignes (observations)

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ée

Exemple : 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ée

filter() 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ée

Filtrer 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 NA

Chaque ligne contient un NA. Essayons maintenant de filtrer avec une condition portant sur chaque variable :

my_data |> filter(Var1>4, Var2&lt;10, Var3=="Ja")
## A tibble: 0 × 3

Comme 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 NA

Filtrer 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 Nej

Filtrer 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