Hur man ersätter saknade värden(NA) i R: na.omit & na.rm

Saknade värden inom datavetenskap uppstår när en observation saknas i en kolumn i en dataram eller innehåller ett teckenvärde istället för ett numeriskt värde. Saknade värden måste tas bort eller ersättas för att dra korrekta slutsatser från data.

I den här handledningen kommer vi att lära oss hur man hanterar saknade värden med dplyr-biblioteket. dplyr bibliotek är en del av ett ekosystem för att realisera en dataanalys.

Ersätt saknade värden i R

I den här handledningen kommer du att lära dig

mutera()

Det fjärde verbet i dplyr bibliotek är användbart för att skapa en ny variabel eller ändra värdena för en befintlig variabel.

Vi kommer att gå vidare i två delar. Vi kommer att lära oss hur man:

  • exkludera saknade värden från en dataram
  • beräkna saknade värden med medelvärde och median

Verbet mutate() är mycket lätt att använda. Vi kan skapa en ny variabel enligt denna syntax:

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()

Exkludera saknade värden (NA)

Metoden na.omit() från dplyr-biblioteket är ett enkelt sätt att utesluta saknade observationer. Att tappa all NA från data är lätt men det betyder inte att det är den mest eleganta lösningen. Under analysen är det klokt att använda olika metoder för att hantera saknade värden

För att ta itu med problemet med saknade observationer kommer vi att använda den titaniska datamängden. I denna datauppsättning har vi tillgång till information om passagerarna ombord under tragedin. Denna datauppsättning har många NA som måste tas om hand.

Vi laddar upp csv-filen från internet och kontrollerar sedan vilka kolumner som har NA. För att returnera kolumnerna med saknade data kan vi använda följande kod:

Låt oss ladda upp data och verifiera de saknade uppgifterna.

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

Produktion:

## [1] "age"  "fare"

Här,

colnames(df_titanic)[apply(df_titanic, 2, anyNA)]

Ger namnet på kolumner som inte har data.

Kolumnerna ålder och pris saknar värden.

Vi kan släppa dem med na.omit().

library(dplyr)
# Exclude the missing observations
df_titanic_drop <-df_titanic %>%
na.omit()		
dim(df_titanic_drop)

Produktion:

## [1] 1045   13

Den nya datamängden innehåller 1045 rader jämfört med 1309 med den ursprungliga datamängden.

Uteslut saknade värden

Imputera saknade data med medelvärde och median

Vi skulle också kunna imputera (befolka) saknade värden med medianen eller medelvärdet. En bra praxis är att skapa två separata variabler för medelvärdet och medianen. När de har skapats kan vi ersätta de saknade värdena med de nybildade variablerna.

Vi kommer att använda appliceringsmetoden för att beräkna medelvärdet av kolumnen med NA. Låt oss se ett exempel

Steg 1) Tidigare i handledningen lagrade vi kolumnnamnet med de saknade värdena i listan som heter list_na. Vi kommer att använda den här listan

Steg 2) Nu måste vi beräkna medelvärdet med argumentet na.rm = TRUE. Detta argument är obligatoriskt eftersom kolumnerna saknar data, och detta säger till R att ignorera dem.

# Create mean
average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],
      2,
      mean,
      na.rm =  TRUE)
average_missing

Kodförklaring:

Vi skickar 4 argument i appliceringsmetoden.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. Denna kod kommer att returnera kolumnnamnet från list_na-objektet (dvs. "ålder" och "pris")
  • 2: Beräkna funktionen på kolumnerna
  • medelvärde: Beräkna medelvärdet
  • na.rm = TRUE: Ignorera de saknade värdena

Produktion:

##      age     fare 
## 29.88113 33.29548

Vi har framgångsrikt skapat medelvärdet av kolumnerna som innehåller saknade observationer. Dessa två värden kommer att användas för att ersätta de saknade observationerna.

Steg 3) Byt ut NA-värdena

Verbet mutera från dplyr-biblioteket är användbart för att skapa en ny variabel. Vi vill inte nödvändigtvis ändra den ursprungliga kolumnen så att vi kan skapa en ny variabel utan NA. mutate är lätt att använda, vi väljer bara ett variabelnamn och definierar hur denna variabel ska skapas. Här är hela 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))

Kodförklaring:

Vi skapar två variabler, replace_mean_age och replace_mean_fare enligt följande:

  • replace_mean_age = ifelse(is.na(age), average_missing[1], age)
  • replace_mean_fare = ifelse(is.na(fare), average_missing[2],fare)

Om kolumnåldern saknar värden, ersätt sedan med det första elementet av medelvärde_missing (medelvärde), annars behåll de ursprungliga värdena. Samma logik för biljettpris

sum(is.na(df_titanic_replace$age))

Produktion:

## [1] 263

Utför bytet

sum(is.na(df_titanic_replace$replace_mean_age))

Produktion:

## [1] 0

Den ursprungliga kolumnåldern har 263 saknade värden medan den nyskapade variabeln har ersatt dem med medelvärdet av variabeln ålder.

Steg 4) Vi kan ersätta de saknade observationerna med medianen också.

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)

Produktion:

Imputera saknade data med medelvärde och median

Steg 5) En stor datamängd kan ha många saknade värden och ovanstående metod kan vara besvärlig. Vi kan utföra alla ovanstående steg ovan i en kodrad med metoden sapply(). Även om vi inte skulle känna till värdena för medelvärde och median.

sapply skapar inte en dataram, så att vi kan slå in funktionen sapply() i data.frame() för att skapa ett dataramobjekt.

# 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)))

Sammanfattning

Vi har tre metoder för att hantera saknade värden:

  • Uteslut alla saknade observationer
  • Beräkna med medelvärdet
  • Imputera med medianen

Följande tabell sammanfattar hur man tar bort alla saknade observationer

Bibliotek Mål Koda
bas Lista saknade observationer
colnames(df)[apply(df, 2, anyNA)]
dplyr Ta bort alla saknade värden
na.omit(df)

Imputering med medelvärde eller median kan göras på två sätt

  • Använder applicera
  • Använder sapply
Metod Detaljer Fördelar Nackdelar
Steg för steg med ansök Kontrollera kolumner med saknas, beräkna medelvärde/median, lagra värdet, ersätt med mutate() Du vet värdet av medel/median Mer utförandetid. Kan vara långsam med stora dataset
Snabbt sätt med sapply Använd sapply() och data.frame() för att automatiskt söka och ersätta saknade värden med medelvärde/median Kort kod och snabb Vet inte imputeringsvärdena