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