Filtrera rader med filter()
Funktionen filter()
används för att filtrera rader, för att behålla de som uppfyller ett eller flera kriterier. För att skapa kriterier kan du använda flera olika operander, vilka demonstreras nedan. Likt föregående kapitel används mpg data för att demonstrera funktionen. Aktivera tidyverse (som innehåller dplyr och mpg data).
library(tidyverse)
Här nedan demonstreras olika exempel på hur filter()
kan användas.
Exempel: Behåll alla rader med minst 2 på variabeln 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
Exempel: Behåll alla rader med minst 2 på displ
och där class
är "compact" och där cyl
är större än medelvärdet för 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 kombineras med group_by()
för att filtrera separat inom varje grupp. Detta är mycket användbart när ett villkor behöver variera inom olika grupper. Ponera exempelvis att vi vill behålla alla rader där cyl
är större än medelvärdet för cyl
inom varje enskild billtillverkare (variabeln manufacturer
är biltillverkare):
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 specificerad missing (NA)
Observationer som har missing på en variabel som ingår i ett filter()
-kriterium kommer inte att bedömas och kan därmed inte behållas. Missing specificeras med NA
(Not Available). Lått oss skapa övningsdata för att demonstrera hur missing kan specificeras i filter()
. Vi skapar data med funktionen tibble()
, med vilken man kan skapa dataframes:
# Skapa 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 finns en NA
på varje rad. Låt oss nu prova filtrera med ett villkor för varje variabel:
my_data |> filter(Var1>4, Var2<10, Var3=="Ja")
# A tibble: 0 × 3
Som framgår ovan kvarstår inga rader! Detta beror på att första observationen saknar information (NA
) på Var1
, vilket exkluderar observationen. Andra patienten saknar information på Var2
, vilket exkluderar observationen. Tredje observationen saknar information på Var3
, vilket exkluderar observationen och därmed kvarstår inga observationer.
För att hantera detta problem finns funktionen is.na()
. Funktionen används som följer:
is.na()
frågar om ett värde saknas. Om värdet saknas så är villkoret uppfyllt.!is.na()
frågar om ett värde inte saknas, dvs om värdet existerar. Operanden!
betyder "tvärtom" eller "inte" i R. Villkoret!is.na()
betyder således "saknas inte".
I nästa exempel behåller vi rader där Var1
är större än 6 eller saknas. I R används |
för att specificera "eller". Koden blir som följer:
my_data |> filter(Var1>6 | is.na(Var1))
Var1 Var2 Var3
NA 1 Ja
9 3 NA
Filter med ett numeriskt intervall
Ett numeriskt intervall kan specificeras med %in%
som läses "inuti". Här följer två exempel som behåller alla rader där Var1
är någon av siffrorna 0, 1, 2, 3, 4, 5, 6. I första exemplet kombineras %in%
med :
och i andra exemplet med c()
.
# Exempel 1
my_data |> filter(Var1 %in% 0:6)
# Exempel 2
my_data |> filter(Var1 %in% c(0, 1, 2, 3, 4, 5, 6))
Var1 Var2 Var3
5 NA Nej
Filter med ett kategoriskt intervall
Ett kategoriskt intervall kan också specificeras med %in%
. Här behåller vi alla rader där Var3
är ekvivalent med antingen "Ja" eller "Nej":
my_data |> filter(Var3 %in% c("Ja", "Nej"))
Var1 Var2 Var3
NA 1 Ja
5 NA Nej