Hvordan erstatte manglende verdier(NA) i R: na.omit & na.rm
Manglende verdier i datavitenskap oppstår når en observasjon mangler i en kolonne i en dataramme eller inneholder en tegnverdi i stedet for numerisk verdi. Manglende verdier må droppes eller erstattes for å trekke korrekte konklusjoner fra dataene.
I denne opplæringen lærer vi hvordan du håndterer manglende verdier med dplyr-biblioteket. dplyr-biblioteket er en del av et økosystem for å realisere en dataanalyse.
I denne opplæringen lærer du
- mutere()
- Ekskluder manglende verdier (NA)
- Beregn manglende verdier (NA) med gjennomsnittet og medianen
mutere()
Det fjerde verbet i dplyr bibliotek er nyttig for å lage ny variabel eller endre verdiene til en eksisterende variabel.
Vi går videre i to deler. Vi vil lære hvordan:
- ekskluder manglende verdier fra en dataramme
- beregne manglende verdier med gjennomsnitt og median
Verbet mutate() er veldig enkelt å bruke. Vi kan lage en ny variabel etter denne syntaksen:
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 verdier (NA)
Na.omit()-metoden fra dplyr-biblioteket er en enkel måte å utelukke manglende observasjon. Det er enkelt å slippe all NA fra dataene, men det betyr ikke at det er den mest elegante løsningen. Under analyse er det lurt å bruke forskjellige metoder for å håndtere manglende verdier
For å takle problemet med manglende observasjoner, vil vi bruke det titaniske datasettet. I dette datasettet har vi tilgang til informasjonen til passasjerene om bord under tragedien. Dette datasettet har mange NA som må tas vare på.
Vi vil laste opp csv-filen fra internett og deretter sjekke hvilke kolonner som har NA. For å returnere kolonnene med manglende data, kan vi bruke følgende kode:
La oss laste opp dataene og bekrefte de manglende dataene.
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
Utgang:
## [1] "age" "fare"
Her
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Gir navnet på kolonner som ikke har data.
Kolonnene alder og pris mangler verdier.
Vi kan slippe dem med na.omit().
library(dplyr) # Exclude the missing observations df_titanic_drop <-df_titanic %>% na.omit() dim(df_titanic_drop)
Utgang:
## [1] 1045 13
Det nye datasettet inneholder 1045 rader sammenlignet med 1309 med det originale datasettet.
Beregn manglende data med gjennomsnitt og median
Vi kan også imputere (utfylle) manglende verdier med medianen eller gjennomsnittet. En god praksis er å lage to separate variabler for gjennomsnittet og medianen. Når den er opprettet, kan vi erstatte de manglende verdiene med de nyopprettede variablene.
Vi vil bruke bruksmetoden for å beregne gjennomsnittet av kolonnen med NA. La oss se et eksempel
Trinn 1) Tidligere i opplæringen lagret vi kolonnenavnet med de manglende verdiene i listen kalt list_na. Vi vil bruke denne listen
Trinn 2) Nå må vi beregne gjennomsnittet med argumentet na.rm = TRUE. Dette argumentet er obligatorisk fordi kolonnene har manglende data, og dette forteller R å 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 søknadsmetoden.
- df: df_titanic[,colnames(df_titanic) %in% list_na]. Denne koden vil returnere kolonnenavnet fra list_na-objektet (dvs. "alder" og "pris")
- 2: Regn ut funksjonen på kolonnene
- gjennomsnitt: Beregn gjennomsnittet
- na.rm = TRUE: Ignorer de manglende verdiene
Utgang:
## age fare ## 29.88113 33.29548
Vi har opprettet gjennomsnittet av kolonnene som inneholder manglende observasjoner. Disse to verdiene vil bli brukt til å erstatte de manglende observasjonene.
Trinn 3) Erstatt NA-verdiene
Verbet mutere fra dplyr-biblioteket er nyttig for å lage en ny variabel. Vi ønsker ikke nødvendigvis å endre den opprinnelige kolonnen slik at vi kan lage en ny variabel uten NA. mutate er enkel å bruke, vi velger bare et variabelnavn og definerer hvordan denne variabelen skal lages. Her er den komplette koden
# 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 lager 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 verdier, erstatt med det første elementet av gjennomsnitt_missing (middelverdi), ellers behold de opprinnelige verdiene. Samme logikk for billettpris
sum(is.na(df_titanic_replace$age))
Utgang:
## [1] 263
Utfør utskiftingen
sum(is.na(df_titanic_replace$replace_mean_age))
Utgang:
## [1] 0
Den opprinnelige kolonnealderen har 263 manglende verdier mens den nyopprettede variabelen har erstattet dem med gjennomsnittet av variabelen alder.
Trinn 4) Vi kan erstatte de manglende observasjonene med medianen også.
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)
Utgang:
Trinn 5) Et stort datasett kan ha mange manglende verdier, og metoden ovenfor kan være tungvint. Vi kan utføre alle trinnene ovenfor i én kodelinje ved å bruke sapply()-metoden. Selv om vi ikke ville vite verdiene mellom gjennomsnitt og median.
sapply oppretter ikke en Dataramme, slik at vi kan pakke sapply()-funksjonen i data.frame() for å lage 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)))
Sammendrag
Vi har tre metoder for å håndtere manglende verdier:
- Ekskluder alle de manglende observasjonene
- Imputere med gjennomsnittet
- Imputer med medianen
Tabellen nedenfor oppsummerer hvordan du fjerner alle manglende observasjoner
Bibliotek | Målet | Kode |
---|---|---|
basen | List opp manglende observasjoner |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Fjern alle manglende verdier |
na.omit(df) |
Imputering med gjennomsnitt eller median kan gjøres på to måter
- Bruker søke
- Bruker sapply
Metode | Detaljer | Fordeler | Ulemper |
---|---|---|---|
Steg for steg med søknad | Sjekk kolonner med manglende, beregne gjennomsnitt/median, lagre verdien, erstatt med mutate() | Du vet verdien av middel/median | Mer gjennomføringstid. Kan være treg med stort datasett |
Rask måte med sapply | Bruk sapply() og data.frame() for å automatisk søke etter og erstatte manglende verdier med gjennomsnitt/median | Kort kode og rask | Vet ikke imputasjonsverdiene |