Jak nahradit chybějící hodnoty (NA) v R: na.omit & na.rm
Chybějící hodnoty ve vědě o datech vznikají, když pozorování chybí ve sloupci datového rámce nebo obsahuje znakovou hodnotu místo číselné hodnoty. Chybějící hodnoty musí být vypuštěny nebo nahrazeny, aby bylo možné z dat vyvodit správný závěr.
V tomto tutoriálu se naučíme, jak se vypořádat s chybějícími hodnotami pomocí knihovny dplyr. Knihovna dplyr je součástí ekosystému pro realizaci analýzy dat.
V tomto tutoriálu se to naučíte
mutovat()
Čtvrté sloveso v knihovna dplyr je užitečné vytvořit novou proměnnou nebo změnit hodnoty existující proměnné.
Budeme postupovat ve dvou částech. Naučíme se, jak:
- vyloučit chybějící hodnoty z datového rámce
- dopočítat chybějící hodnoty průměrem a mediánem
Sloveso mutate() se používá velmi snadno. Můžeme vytvořit novou proměnnou podle této syntaxe:
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()
Vyloučit chybějící hodnoty (NA)
Metoda na.omit() z knihovny dplyr je jednoduchý způsob, jak vyloučit chybějící pozorování. Vypuštění všech NA z dat je snadné, ale to neznamená, že je to nejelegantnější řešení. Během analýzy je moudré používat různé metody k řešení chybějících hodnot
K vyřešení problému chybějících pozorování použijeme titánský datový soubor. V tomto datovém souboru máme přístup k informacím cestujících na palubě během tragédie. Tato datová sada má mnoho NA, o které je třeba se starat.
Nahrajeme soubor csv z internetu a poté zkontrolujeme, které sloupce mají NA. Chcete-li vrátit sloupce s chybějícími daty, můžeme použít následující kód:
Nahrajeme data a ověříme chybějící 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
Výstup:
## [1] "age" "fare"
Zde,
colnames(df_titanic)[apply(df_titanic, 2, anyNA)]
Uvádí názvy sloupců, které neobsahují data.
Ve sloupcích stáří a jízdné chybí hodnoty.
Můžeme je vypustit pomocí na.omit().
library(dplyr) # Exclude the missing observations df_titanic_drop <-df_titanic %>% na.omit() dim(df_titanic_drop)
Výstup:
## [1] 1045 13
Nová datová sada obsahuje 1045 řádků ve srovnání s 1309 s původní datovou sadou.
Imputovat chybějící data s průměrem a mediánem
Chybějící hodnoty bychom také mohli imputovat (naplnit) mediánem nebo průměrem. Osvědčeným postupem je vytvořit dvě samostatné proměnné pro průměr a medián. Po vytvoření můžeme chybějící hodnoty nahradit nově vytvořenými proměnnými.
Použijeme metodu aplikace k výpočtu střední hodnoty sloupce s NA. Podívejme se na příklad
Krok 1) Dříve v tutoriálu jsme uložili název sloupců s chybějícími hodnotami do seznamu s názvem seznam_na. Tento seznam použijeme
Krok 2) Nyní musíme vypočítat střední hodnotu s argumentem na.rm = TRUE. Tento argument je povinný, protože ve sloupcích chybí data, což říká R, aby je ignoroval.
# Create mean average_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na], 2, mean, na.rm = TRUE) average_missing
Vysvětlení kódu:
V metodě apply předáme 4 argumenty.
- df: df_titanic[,colnames(df_titanic) %in% seznam_na]. Tento kód vrátí název sloupců z objektu list_na (tj. „věk“ a „jízdné“).
- 2: Vypočítejte funkci na sloupcích
- střední: Vypočítejte průměr
- na.rm = TRUE: Ignorovat chybějící hodnoty
Výstup:
## age fare ## 29.88113 33.29548
Úspěšně jsme vytvořili průměr sloupců obsahujících chybějící pozorování. Tyto dvě hodnoty budou použity k nahrazení chybějících pozorování.
Krok 3) Vyměňte hodnoty NA
Sloveso mutate z knihovny dplyr je užitečné při vytváření nové proměnné. Nemusíme nutně měnit původní sloupec, abychom mohli vytvořit novou proměnnou bez NA. mutate se snadno používá, stačí si vybrat název proměnné a definovat, jak tuto proměnnou vytvořit. Zde je úplný kód
# 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))
Vysvětlení kódu:
Vytvoříme dvě proměnné, nahradit_průměrný_věk a střední_průměrný_fare nahradit následovně:
- nahradit_průměrný_věk = ifelse(is.na(věk), průměrný_chybějící[1], věk)
- nahradit_průměrné_jízdné = ifelse(is.na(jízdné), průměrné_chybějící[2],jízdné)
Pokud ve sloupci stáří chybí hodnoty, nahraďte je prvním prvkem average_missing (střední hodnota věku), jinak ponechte původní hodnoty. Stejná logika pro jízdné
sum(is.na(df_titanic_replace$age))
Výstup:
## [1] 263
Proveďte výměnu
sum(is.na(df_titanic_replace$replace_mean_age))
Výstup:
## [1] 0
V původním sloupci stáří chybí 263 hodnot, zatímco nově vytvořená proměnná je nahradila průměrem proměnné stáří.
Krok 4) Chybějící pozorování můžeme nahradit i mediánem.
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)
Výstup:
Krok 5) Velká sada dat může obsahovat mnoho chybějících hodnot a výše uvedená metoda může být těžkopádná. Všechny výše uvedené kroky můžeme provést na jednom řádku kódu pomocí metody sapply(). I když bychom neznali střední a střední hodnoty.
sapply nevytváří a datový rámec, takže můžeme zabalit funkci sapply() do data.frame() a vytvořit objekt datového rámce.
# 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)))
Shrnutí
Máme tři způsoby, jak se vypořádat s chybějícími hodnotami:
- Vylučte všechna chybějící pozorování
- Přičítat průměr
- Připočítat s mediánem
Následující tabulka shrnuje, jak odstranit všechna chybějící pozorování
Knihovna | Objektivní | Kód |
---|---|---|
základna | Vyjmenujte chybějící pozorování |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Odstraňte všechny chybějící hodnoty |
na.omit(df) |
Imputaci s průměrem nebo mediánem lze provést dvěma způsoby
- Použití použít
- Pomocí sapply
Metoda | Detaily | Výhody | Nevýhody |
---|---|---|---|
Krok za krokem s aplikací | Zkontrolujte sloupce s chybějícími, vypočítejte průměr/medián, uložte hodnotu, nahraďte pomocí mutate() | Znáte hodnotu prostředku/mediánu | Více času provedení. Může být pomalý s velkou datovou sadou |
Rychlý způsob se sapply | Použijte sapply() a data.frame() k automatickému vyhledání a nahrazení chybějících hodnot průměrem/mediánem | Krátký kód a rychlý | Neznám imputační hodnoty |