Dplyr filter(): Filtrér rækker (observationer)

Filtrér rækker med filter()

Funktionen filter() bruges til at filtrere rækker, så man beholder dem, der opfylder et eller flere kriterier. Til at opstille kriterier kan du bruge flere forskellige operatorer, som demonstreres nedenfor. Ligesom i det foregående kapitel bruges mpg-data til at demonstrere funktionen. Aktivér tidyverse (som indeholder dplyr og mpg-data).

library(tidyverse)

Herunder demonstreres forskellige eksempler på, hvordan filter() kan bruges.

Eksempel: Behold alle rækker med mindst 2 på variablen displ:

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
## Afkortet udskrift

Eksempel: Behold alle rækker med mindst 2 på displ, hvor class er "compact", og hvor cyl er større end gennemsnittet for 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
## Afkortet udskrift

Filter kan kombineres med group_by() for at filtrere separat inden for hver gruppe. Det er meget nyttigt, når en betingelse skal variere mellem forskellige grupper. Antag for eksempel, at vi vil beholde alle rækker, hvor cyl er større end gennemsnittet for cyl inden for hver enkelt bilproducent (variablen manufacturer er bilproducent):

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
## Afkortet udskrift

Filter med specificeret missing (NA)

Observationer, der har missing på en variabel, som indgår i et filter()-kriterium, bliver ikke vurderet og kan derfor ikke beholdes. Missing angives med NA (Not Available). Lad os oprette øvelsesdata for at demonstrere, hvordan missing kan angives i filter(). Vi opretter data med funktionen tibble(), som man kan bruge til at oprette dataframes:

## Opret data
my_data <- tibble(Var1 = c(NA, 5, 9),
                  Var2 = c(1, NA, 3),
                  Var3 = c("Ja", "Nej", NA))

## Vis data
my_data
   Var1  Var2 Var3
     NA     1 Ja
      5    NA Nej
      9     3 NA

Der er en NA på hver række. Lad os nu prøve at filtrere med en betingelse for hver variabel:

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

Som det fremgår ovenfor, er der ingen rækker tilbage! Det skyldes, at den første observation mangler information (NA) på Var1, hvilket ekskluderer observationen. Den anden patient mangler information på Var2, hvilket ekskluderer observationen. Den tredje observation mangler information på Var3, hvilket ekskluderer observationen, og dermed er der ingen observationer tilbage.

Til at håndtere dette problem findes funktionen is.na(). Funktionen bruges på følgende måde:

  • is.na() spørger, om en værdi mangler. Hvis værdien mangler, er betingelsen opfyldt.
  • !is.na() spørger, om en værdi ikke mangler, dvs. om værdien eksisterer. Operatoren ! betyder "omvendt" eller "ikke" i R. Betingelsen !is.na() betyder således "mangler ikke".

I det næste eksempel beholder vi rækker, hvor Var1 er større end 6 eller mangler. I R bruges | til at angive "eller". Koden bliver som følger:

my_data |> filter(Var1>6 | is.na(Var1))
   Var1  Var2 Var3
     NA     1 Ja
      9     3 NA

Filter med et numerisk interval

Et numerisk interval kan angives med %in%, som læses "inden i". Her følger to eksempler, der beholder alle rækker, hvor Var1 er et af tallene 0, 1, 2, 3, 4, 5, 6. I det første eksempel kombineres %in% med : og i det andet eksempel med c().

## Eksempel 1
my_data |> filter(Var1 %in% 0:6)

## Eksempel 2
my_data |> filter(Var1 %in% c(0, 1, 2, 3, 4, 5, 6))
   Var1  Var2 Var3
      5    NA Nej

Filter med et kategorisk interval

Et kategorisk interval kan også angives med %in%. Her beholder vi alle rækker, hvor Var3 er lig med enten "Ja" eller "Nej":

my_data |> filter(Var3 %in% c("Ja", "Nej"))
   Var1  Var2 Var3
     NA     1 Ja
      5    NA Nej