Dplyr filter(): Filtrere rader (observasjoner)

Filtrere rader med filter()

Funksjonen filter() brukes til å filtrere rader, slik at du beholder de som oppfyller ett eller flere kriterier. For å lage kriterier kan du bruke flere ulike operander, som demonstreres nedenfor. I likhet med forrige kapittel brukes mpg-data for å demonstrere funksjonen. Aktiver tidyverse (som inneholder dplyr og mpg-data).

library(tidyverse)

Nedenfor demonstreres ulike eksempler på hvordan filter() kan brukes.

Eksempel: Behold alle rader med minst 2 på variabelen 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
## Avkortad utskrift

Eksempel: Behold alle rader med minst 2 på displ, der class er "compact" og der cyl er større enn gjennomsnittet 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
## Avkortad utskrift

Filter kan kombineres med group_by() for å filtrere separat innenfor hver gruppe. Dette er svært nyttig når et vilkår må variere mellom ulike grupper. Anta for eksempel at vi vil beholde alle rader der cyl er større enn gjennomsnittet for cyl innenfor hver enkelt bilprodusent (variabelen manufacturer er bilprodusent):

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
## Avkortad utskrift

Filter med spesifisert missing (NA)

Observasjoner som har missing på en variabel som inngår i et filter()-kriterium, blir ikke vurdert og kan dermed ikke beholdes. Missing angis med NA (Not Available). La oss lage øvingsdata for å demonstrere hvordan missing kan spesifiseres i filter(). Vi lager data med funksjonen tibble(), som man kan bruke til å lage dataframes:

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

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

Det finnes én NA på hver rad. La oss nå prøve å filtrere med ett vilkår for hver variabel:

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

Som det fremgår ovenfor, gjenstår ingen rader! Dette skyldes at den første observasjonen mangler informasjon (NA) på Var1, noe som ekskluderer observasjonen. Den andre pasienten mangler informasjon på Var2, noe som ekskluderer observasjonen. Den tredje observasjonen mangler informasjon på Var3, noe som ekskluderer observasjonen, og dermed gjenstår ingen observasjoner.

For å håndtere dette problemet finnes funksjonen is.na(). Funksjonen brukes slik:

  • is.na() spør om en verdi mangler. Hvis verdien mangler, er vilkåret oppfylt.
  • !is.na() spør om en verdi ikke mangler, altså om verdien finnes. Operanden ! betyr "motsatt" eller "ikke" i R. Vilkåret !is.na() betyr dermed "mangler ikke".

I neste eksempel beholder vi rader der Var1 er større enn 6 eller mangler. I R brukes | for å angi "eller". Koden blir slik:

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

Filter med et numerisk intervall

Et numerisk intervall kan spesifiseres med %in%, som leses "inni". Her følger to eksempler som beholder alle rader der Var1 er et av tallene 0, 1, 2, 3, 4, 5, 6. I det første eksemplet kombineres %in% med :, og i det andre eksemplet 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 intervall

Et kategorisk intervall kan også spesifiseres med %in%. Her beholder vi alle rader der Var3 er ekvivalent med enten "Ja" eller "Nej":

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