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)
Metoden na.omit() fra dplyr-biblioteket er en enkel mรฅte รฅ utelukke manglende observasjoner pรฅ. Droppping All NA fra dataene er enkel, 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
Code Forklaring:
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))
Code Forklaring:
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 | Code |
|---|---|---|
| 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 |



