Jak zastąpić brakujące wartości (NA) w R: na.omit i na.rm

Brakujące wartości w nauce o danych powstają, gdy w kolumnie ramki danych brakuje obserwacji lub zawiera ona wartość znakową zamiast wartości liczbowej. Aby wyciągnąć prawidłowe wnioski z danych, należy usunąć lub zastąpić brakujące wartości.

W tym samouczku nauczymy się, jak radzić sobie z brakującymi wartościami za pomocą biblioteki dplyr. Biblioteka dplyr jest częścią ekosystemu służącego do przeprowadzania analizy danych.

Zamień brakujące wartości w R

W tym samouczku dowiesz się

zmutować()

Czwarty czasownik w biblioteka dplyr jest pomocne przy tworzeniu nowej zmiennej lub zmianie wartości istniejącej zmiennej.

Będziemy postępować w dwóch częściach. Dowiemy się jak:

  • wyklucz brakujące wartości z ramki danych
  • przypisz brakujące wartości średnią i medianą

Czasownik mutate() jest bardzo łatwy w użyciu. Możemy utworzyć nową zmienną, postępując zgodnie z tą składnią:

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

Wyklucz brakujące wartości (NA)

Metoda na.omit() z biblioteki dplyr to prosty sposób na wykluczenie brakujących obserwacji. Usunięcie wszystkich NA z danych jest łatwe, ale nie oznacza to, że jest to najbardziej eleganckie rozwiązanie. Podczas analizy rozsądnie jest używać różnych metod do radzenia sobie z brakującymi wartościami

Aby rozwiązać problem brakujących obserwacji, wykorzystamy zbiór danych Titanica. W tym zbiorze danych mamy dostęp do informacji o pasażerach na pokładzie podczas tragedii. Ten zbiór danych zawiera wiele NA, którymi należy się zająć.

Prześlemy plik csv z Internetu, a następnie sprawdzimy, które kolumny mają NA. Aby zwrócić kolumny z brakującymi danymi, możemy użyć następującego kodu:

Prześlijmy dane i zweryfikujmy brakujące dane.

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

Wyjście:

## [1] "age"  "fare"

Tutaj,

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

Podaje nazwy kolumn, które nie zawierają danych.

W kolumnach wiek i taryfa brakuje wartości.

Możemy je usunąć za pomocą na.omit().

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

Wyjście:

## [1] 1045   13

Nowy zbiór danych zawiera 1045 wierszy w porównaniu do 1309 w oryginalnym zbiorze danych.

Wyklucz brakujące wartości

Podstaw brakujące dane średnią i medianą

Możemy również przypisać (wypełnić) brakujące wartości medianą lub średnią. Dobrą praktyką jest utworzenie dwóch oddzielnych zmiennych dla średniej i mediany. Po utworzeniu możemy zastąpić brakujące wartości nowo utworzonymi zmiennymi.

Użyjemy metody Apply, aby obliczyć średnią kolumny z NA. Zobaczmy przykład

Krok 1) Wcześniej w samouczku zapisaliśmy nazwy kolumn z brakującymi wartościami na liście o nazwie list_na. Będziemy korzystać z tej listy

Krok 2) Teraz musimy obliczyć średnią za pomocą argumentu na.rm = TRUE. Argument ten jest obowiązkowy, ponieważ w kolumnach brakuje danych, co informuje R, aby je zignorował.

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

Wyjaśnienie kodu:

W metodzie Apply przekazujemy 4 argumenty.

  • df: df_titanic[,colnames(df_titanic) %in%list_na]. Ten kod zwróci nazwy kolumn z obiektu list_na (tj. „wiek” i „taryfa”)
  • 2: Oblicz funkcję w kolumnach
  • średnia: Oblicz średnią
  • na.rm = TRUE: Zignoruj ​​brakujące wartości

Wyjście:

##      age     fare 
## 29.88113 33.29548

Pomyślnie utworzyliśmy średnią kolumn zawierających brakujące obserwacje. Te dwie wartości zostaną użyte do zastąpienia brakujących obserwacji.

Krok 3) Zastąp wartości NA

Czasownik mutate z biblioteki dplyr jest przydatny przy tworzeniu nowej zmiennej. Niekoniecznie chcemy zmieniać oryginalną kolumnę, aby móc utworzyć nową zmienną bez NA. mutate jest łatwy w użyciu, po prostu wybieramy nazwę zmiennej i określamy, jak utworzyć tę zmienną. Oto pełny kod

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

Wyjaśnienie kodu:

Tworzymy dwie zmienne, zamień_średni_age i zamień_średnią_cenę w następujący sposób:

  • zamień_średni_wiek = ifelse(is.na(wiek), średni_brak[1], wiek)
  • zamień_średnią_fare = ifelse(is.na(taryfa), średni_brak [2],taryfa)

Jeśli w kolumnie wiek brakuje wartości, zastąp je pierwszym elementem średniej_braku (średnia wieku), w przeciwnym razie zachowaj oryginalne wartości. Ta sama logika w przypadku taryf

sum(is.na(df_titanic_replace$age))

Wyjście:

## [1] 263

Wykonaj wymianę

sum(is.na(df_titanic_replace$replace_mean_age))

Wyjście:

## [1] 0

W pierwotnej kolumnie Wiek brakowało 263 wartości, natomiast nowo utworzona zmienna zastąpiła je średnią ze zmiennej Wiek.

Krok 4) Brakujące obserwacje możemy również zastąpić medianą.

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)

Wyjście:

Podstaw brakujące dane średnią i medianą

Krok 5) Duży zbiór danych może zawierać wiele brakujących wartości, a powyższa metoda może być uciążliwa. Wszystkie powyższe kroki możemy wykonać w jednym wierszu kodu, używając metody sapply(). Chociaż nie znalibyśmy wartości średniej i mediany.

saapply nie tworzy pliku ramka danych, dzięki czemu możemy zawinąć funkcję sapply() w data.frame() i utworzyć obiekt ramki danych.

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

Podsumowanie

Mamy trzy metody radzenia sobie z brakującymi wartościami:

  • Wyklucz wszystkie brakujące obserwacje
  • Przypisz średnią
  • Przypisz medianą

W poniższej tabeli podsumowano, jak usunąć wszystkie brakujące obserwacje

Biblioteka Cel Code
baza Wypisz brakujące obserwacje
colnames(df)[apply(df, 2, anyNA)]
dplyr Usuń wszystkie brakujące wartości
na.omit(df)

Impucję średnią lub medianą można przeprowadzić na dwa sposoby

  • Używając zastosuj
  • Używanie SAPPLY
Metoda wykonania Szczegóły Zalety Niedogodności
Krok po kroku z zastosowaniem Sprawdź kolumny z brakującymi, oblicz średnią/medianę, zapisz wartość, zamień na mutate() Znasz wartość średnich/mediany Dłuższy czas realizacji. Może być powolny w przypadku dużego zbioru danych
Szybki sposób z sapply Użyj sapply() i data.frame(), aby automatycznie wyszukiwać i zastępować brakujące wartości średnią/medianą Krótki kod i szybko Nie znam wartości imputacji