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.

Nahradit chybějící hodnoty v R

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.

Vyloučit chybějící hodnoty

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:

Imputovat chybějící data s průměrem a mediánem

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