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.
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.
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:
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 |