Как заменить пропущенные значения (NA) в R: na.omit и na.rm

Пропущенные значения в науке о данных возникают, когда наблюдение отсутствует в столбце фрейма данных или содержит символьное значение вместо числового значения. Отсутствующие значения необходимо отбросить или заменить, чтобы сделать правильный вывод из данных.

В этом уроке мы узнаем, как бороться с пропущенными значениями с помощью библиотеки dplyr. Библиотека dplyr является частью экосистемы для реализации анализа данных.

Заменить пропущенные значения в R

В этом руководстве вы узнаете

мутировать ()

Четвертый глагол в библиотека 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 из данных легко, но это не значит, что это самое элегантное решение. Во время анализа разумно использовать различные методы для устранения пропущенных значений.

Чтобы решить проблему отсутствия наблюдений, мы будем использовать набор данных Titanic. В этом наборе данных у нас есть доступ к информации о пассажирах, находившихся на борту во время трагедии. В этом наборе данных много 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 строками в исходном наборе данных.

Исключить пропущенные значения

Вменение недостающих данных с помощью среднего и медианы

Мы также могли бы вменить (заполнить) недостающие значения медианой или средним значением. Хорошей практикой является создание двух отдельных переменных для среднего и медианы. После создания мы можем заменить отсутствующие значения вновь сформированными переменными.

Мы будем использовать метод apply для вычисления среднего значения столбца с 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(fare), Average_missing[2],fare)

Если в столбце «Возраст» отсутствуют значения, замените их первым элементом Average_missing (средний возраст), иначе сохраните исходные значения. Та же логика для тарифа

sum(is.na(df_titanic_replace$age))

Вывод:

## [1] 263

Выполните замену

sum(is.na(df_titanic_replace$replace_mean_age))

Вывод:

## [1] 0

Исходный столбец age содержит 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 не создает фрейм данных, поэтому мы можем обернуть функцию 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)))

Итого

У нас есть три метода обработки пропущенных значений:

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

В следующей таблице показано, как удалить все недостающие наблюдения.

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

Вменение среднего значения или медианы может быть выполнено двумя способами.

  • Использование приложения
  • Использование саппли
Способ доставки Подробнее Наши преимущества Недостатки бонуса без депозита
Шаг за шагом с применением Проверьте столбцы с отсутствующими значениями, вычислите среднее/медиану, сохраните значение, замените с помощью mutate() Вы знаете ценность среднего/медианы Больше времени выполнения. Может быть медленным с большим набором данных
Быстрый способ с sapply Используйте sapply() и data.frame() для автоматического поиска и замены пропущенных значений средним/медианным значением. Короткий код и быстро Не знаю значений вменения