Sådan erstattes Missing Values(NA) i R: na.omit & na.rm
Manglende værdier i datavidenskab opstår, når en observation mangler i en kolonne i en dataramme eller indeholder en tegnværdi i stedet for en numerisk værdi. Manglende værdier skal slettes eller erstattes for at drage korrekte konklusioner ud fra dataene.
I denne tutorial lærer vi, hvordan man håndterer manglende værdier med dplyr-biblioteket. dplyr bibliotek er en del af et økosystem til at realisere en dataanalyse.
I denne tutorial lærer du
mutere()
Det fjerde verbum i dplyr bibliotek er nyttigt at oprette ny variabel eller ændre værdierne af en eksisterende variabel.
Vi fortsætter i to dele. Vi lærer at:
- ekskluder manglende værdier fra en dataramme
- tilregne manglende værdier med middelværdi og median
Verbet mutate() er meget nemt at bruge. Vi kan oprette en ny variabel efter denne syntaks:
mutate(df, name_variable_1 = condition, ...) arguments: -df: Data frame used to create a new variable -name_variable_1: Name and the formula to create the new variable -...: No limit constraint. Possibility to create more than one variable inside mutate()
Ekskluder manglende værdier (NA)
Metoden na.omit() fra dplyr-biblioteket er en enkel måde at udelukke manglende observation. Det er nemt at droppe al NA fra dataene, men det betyder ikke, at det er den mest elegante løsning. Under analysen er det klogt at bruge forskellige metoder til at håndtere manglende værdier
For at tackle problemet med manglende observationer vil vi bruge det titaniske datasæt. I dette datasæt har vi adgang til oplysningerne om passagererne ombord under tragedien. Dette datasæt har mange NA, der skal tages hånd om.
Vi uploader csv-filen fra internettet og tjekker derefter, hvilke kolonner der har NA. For at returnere kolonnerne med manglende data kan vi bruge følgende kode:
Lad os uploade dataene og bekræfte de manglende data.
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv" df_titanic <- read.csv(PATH, sep = ",") # Return the column names containing missing observations list_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ] list_na
Output:
## [1] "age" "fare"
Her,
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Giver navnet på kolonner, der ikke har data.
Kolonnerne alder og pris mangler værdier.
Vi kan slippe dem med na.omit().
library(dplyr) # Exclude the missing observations df_titanic_drop <-df_titanic %>% na.omit() dim(df_titanic_drop)
Output:
## [1] 1045 13
Det nye datasæt indeholder 1045 rækker sammenlignet med 1309 med det originale datasæt.
Imputer manglende data med middelværdi og median
Vi kunne også imputere (udfylde) manglende værdier med medianen eller middelværdien. En god praksis er at oprette to separate variabler for middelværdien og medianen. Når de er oprettet, kan vi erstatte de manglende værdier med de nydannede variable.
Vi vil bruge appliceringsmetoden til at beregne middelværdien af kolonnen med NA. Lad os se et eksempel
Trin 1) Tidligere i selvstudiet gemte vi kolonnenavnet med de manglende værdier i listen kaldet list_na. Vi vil bruge denne liste
Trin 2) Nu skal vi beregne middelværdien med argumentet na.rm = TRUE. Dette argument er obligatorisk, fordi kolonnerne mangler data, og dette fortæller R at ignorere dem.
# Create mean average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, mean, na.rm = TRUE) average_missing
Kodeforklaring:
Vi sender 4 argumenter i appliceringsmetoden.
- df: df_titanic[,colnames(df_titanic) %in% list_na]. Denne kode returnerer kolonnenavnet fra list_na-objektet (dvs. "alder" og "pris")
- 2: Beregn funktionen på søjlerne
- middelværdi: Beregn middelværdien
- na.rm = TRUE: Ignorer de manglende værdier
Output:
## age fare ## 29.88113 33.29548
Vi har med succes oprettet middelværdien af de kolonner, der indeholder manglende observationer. Disse to værdier vil blive brugt til at erstatte de manglende observationer.
Trin 3) Erstat NA-værdierne
Verbet mutere fra dplyr-biblioteket er nyttigt til at skabe en ny variabel. Vi ønsker ikke nødvendigvis at ændre den oprindelige kolonne, så vi kan oprette en ny variabel uden NA. mutate er let at bruge, vi vælger blot et variabelnavn og definerer, hvordan denne variabel skal oprettes. Her er den komplette kode
# Create a new variable with the mean and median df_titanic_replace <- df_titanic %>% mutate(replace_mean_age = ifelse(is.na(age), average_missing[1], age), replace_mean_fare = ifelse(is.na(fare), average_missing[2], fare))
Kodeforklaring:
Vi opretter to variabler, replace_mean_age og replace_mean_fare som følger:
- replace_mean_age = ifelse(is.na(age), average_missing[1], age)
- replace_mean_fare = ifelse(is.na(fare), average_missing[2],fare)
Hvis kolonnealderen mangler værdier, så erstat med det første element af gennemsnit_missing (middelværdi), ellers behold de oprindelige værdier. Samme logik for billetprisen
sum(is.na(df_titanic_replace$age))
Output:
## [1] 263
Udfør udskiftningen
sum(is.na(df_titanic_replace$replace_mean_age))
Output:
## [1] 0
Den oprindelige kolonnealder har 263 manglende værdier, mens den nyoprettede variabel har erstattet dem med gennemsnittet af variablen alder.
Trin 4) Vi kan også erstatte de manglende observationer med medianen.
median_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, median, na.rm = TRUE) df_titanic_replace <- df_titanic %>% mutate(replace_median_age = ifelse(is.na(age), median_missing[1], age), replace_median_fare = ifelse(is.na(fare), median_missing[2], fare)) head(df_titanic_replace)
Output:
Trin 5) Et stort datasæt kan have mange manglende værdier, og ovenstående metode kan være besværlig. Vi kan udføre alle ovenstående trin ovenfor i en kodelinje ved hjælp af sapply() metoden. Selvom vi ikke ville kende værdierne for middelværdi og median.
sapply skaber ikke en dataramme, så vi kan indpakke sapply()-funktionen i data.frame() for at skabe et datarammeobjekt.
# Quick code to replace missing values with the mean df_titanic_impute_mean < -data.frame( sapply( df_titanic, function(x) ifelse(is.na(x), mean(x, na.rm = TRUE), x)))
Resumé
Vi har tre metoder til at håndtere manglende værdier:
- Udelad alle de manglende observationer
- Imputere med middelværdien
- Imputer med medianen
Følgende tabel opsummerer, hvordan man fjerner alle de manglende observationer
Bibliotek | Objektiv | Kode |
---|---|---|
bund | Liste manglende observationer |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Fjern alle manglende værdier |
na.omit(df) |
Imputation med middelværdi eller median kan udføres på to måder
- Ved hjælp af anvende
- Ved hjælp af sapply
Metode | Detaljer | Fordele | Ulemper |
---|---|---|---|
Trin for trin med ansøgning | Tjek kolonner med manglende, beregn middelværdi/median, gem værdien, erstat med mutate() | Du kender værdien af middel/median | Mere eksekveringstid. Kan være langsom med stort datasæt |
Hurtig måde med sapply | Brug sapply() og data.frame() til automatisk at søge og erstatte manglende værdier med middelværdi/median | Kort kode og hurtig | Kender ikke imputationsværdierne |