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.

Erstat manglende værdier i R

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.

Ekskluder manglende værdier

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:

Imputer manglende data med middelværdi og median

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

Dagligt Guru99 Nyhedsbrev

Start dagen med de seneste og vigtigste AI-nyheder leveret lige nu.