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 utskriftEksempel: 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 utskriftFilter 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 utskriftFilter 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 NADet 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<10, Var3=="Ja")## A tibble: 0 × 3Som 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 NAFilter 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 NejFilter 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