Как да замените липсващи стойности (NA) в R: na.omit & na.rm

Липсващи стойности в науката за данни възникват, когато едно наблюдение липсва в колона на рамка от данни или съдържа символна стойност вместо числова стойност. Липсващите стойности трябва да бъдат премахнати или заменени, за да се направи правилно заключение от данните.

В този урок ще научим как да се справяме с липсващи стойности с библиотеката dplyr. Библиотеката dplyr е част от екосистема за реализиране на анализ на данни.

Заменете липсващите стойности в R

В този урок ще научите

mutate()

Четвъртият глагол в dplyr библиотека е полезно да създадете нова променлива или да промените стойностите на съществуваща променлива.

Ще продължим в две части. Ще научим как да:

  • изключване на липсващи стойности от рамка с данни
  • приписване на липсващи стойности със средната стойност и медианата

Глаголът mutate() е много лесен за използване. Можем да създадем нова променлива, следвайки този синтаксис:

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

Изключване на липсващи стойности (NA)

Методът na.omit() от библиотеката dplyr е лесен начин за изключване на липсващо наблюдение. Отпадането на всички NA от данните е лесно, но това не означава, че е най-елегантното решение. По време на анализа е разумно да използвате различни методи за справяне с липсващите стойности

За да се справим с проблема с липсващите наблюдения, ще използваме титаничния набор от данни. В този набор от данни имаме достъп до информацията за пътниците на борда по време на трагедията. Този набор от данни има много NA, за които трябва да се погрижите.

Ще качим csv файла от интернет и след това ще проверим кои колони имат NA. За да върнем колоните с липсващи данни, можем да използваме следния код:

Нека да качим данните и да проверим липсващите данни.

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

Изход:

## [1] "age"  "fare"

Тук

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

Дава име на колони, които нямат данни.

Колоните възраст и тарифа имат липсващи стойности.

Можем да ги изпуснем с na.omit().

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

Изход:

## [1] 1045   13

Новият набор от данни съдържа 1045 реда в сравнение с 1309 с оригиналния набор от данни.

Изключване на липсващи стойности

Вменете липсващите данни със средната стойност и медианата

Можем също така да вменим (попълним) липсващи стойности с медианата или средната стойност. Добра практика е да създадете две отделни променливи за средната стойност и медианата. Веднъж създадени, можем да заменим липсващите стойности с новоформираните променливи.

Ще използваме метода на прилагане, за да изчислим средната стойност на колоната с NA. Да видим един пример

Стъпка 1) По-рано в урока съхранихме името на колоните с липсващите стойности в списъка, наречен list_na. Ние ще използваме този списък

Стъпка 2) Сега трябва да изчислим средната стойност с аргумента na.rm = TRUE. Този аргумент е задължителен, защото колоните имат липсващи данни и това казва на R да ги игнорира.

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

Обяснение на кода:

Предаваме 4 аргумента в метода apply.

  • df: df_titanic[,colnames(df_titanic) %in% list_na]. Този код ще върне името на колоните от обекта list_na (т.е. „възраст“ и „тарифа“)
  • 2: Изчислете функцията върху колоните
  • средно: Изчислете средната стойност
  • na.rm = TRUE: Игнорирайте липсващите стойности

Изход:

##      age     fare 
## 29.88113 33.29548

Успешно създадохме средната стойност на колоните, съдържащи липсващи наблюдения. Тези две стойности ще бъдат използвани за заместване на липсващите наблюдения.

Стъпка 3) Заменете стойностите на NA

Глаголът mutate от библиотеката dplyr е полезен при създаването на нова променлива. Не искаме непременно да променяме оригиналната колона, за да можем да създадем нова променлива без NA. mutate е лесен за използване, просто избираме име на променлива и определяме как да създадем тази променлива. Ето пълния код

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

Обяснение на кода:

Създаваме две променливи, replace_mean_age и replace_mean_fare, както следва:

  • replace_mean_age = ifelse(is.na(възраст), средна_липсваща[1], възраст)
  • replace_mean_fare = ifelse(is.na(тарифа), средна_липсваща[2],тарифа)

Ако възрастта на колоната има липсващи стойности, заменете с първия елемент от average_missing (средна възраст), в противен случай запазете оригиналните стойности. Същата логика за цената

sum(is.na(df_titanic_replace$age))

Изход:

## [1] 263

Извършете подмяната

sum(is.na(df_titanic_replace$replace_mean_age))

Изход:

## [1] 0

Възрастта на оригиналната колона има 263 липсващи стойности, докато новосъздадената променлива ги е заменила със средната стойност на възрастта на променливата.

Стъпка 4) Можем да заменим и липсващите наблюдения с медианата.

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)

Изход:

Вменете липсващите данни със средната стойност и медианата

Стъпка 5) Голям набор от данни може да има много липсващи стойности и горният метод може да е тромав. Можем да изпълним всички горни стъпки по-горе в един ред код, използвайки метода sapply(). Въпреки че няма да знаем стойностите на средната стойност и медианата.

sapply не създава a рамка с данни, така че можем да обвием функцията sapply() в data.frame(), за да създадем обект на рамка с данни.

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

Oбобщение

Имаме три метода за справяне с липсващи стойности:

  • Изключете всички липсващи наблюдения
  • Приписване със средната стойност
  • Приписване с медианата

Следната таблица обобщава как да премахнете всички липсващи наблюдения

Библиотека Цел код
база Избройте липсващите наблюдения
colnames(df)[apply(df, 2, anyNA)]
dplyr Премахнете всички липсващи стойности
na.omit(df)

Импутацията със средна стойност или медиана може да се извърши по два начина

  • Използване на apply
  • Използване на sapply
Начин на доставка Детайли Предимства Недостатъци
Стъпка по стъпка с прилагане Проверете колоните с липсващи, изчислете средна/медиана, запазете стойността, заменете с mutate() Знаете стойността на средно/медиана Повече време за изпълнение. Може да бъде бавен с голям набор от данни
Бърз начин с приложение Използвайте sapply() и data.frame() за автоматично търсене и заместване на липсващи стойности със средна/медиана Кратък код и бързо Не знам стойностите на импутацията