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.

Erstatt manglende verdier i R

I denne opplæringen lærer du

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.

Ekskluder manglende verdier

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:

Beregn manglende data med gjennomsnitt og median

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