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