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

Содержание:

Anonim

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

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

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

  • мутировать ()
  • Исключить отсутствующие значения (NA)
  • Вписать отсутствующие значения (NA) со средним и медианным значением

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

Четвертый глагол в библиотеке 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 observationslist_na <- colnames(df_titanic)[ apply(df_titanic, 2, anyNA) ]list_na

Выход:

## [1] "age" "fare"

Здесь,

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

Дает имя столбца, в котором нет данных.

В столбцах age и fare отсутствуют значения.

Мы можем удалить их с помощью na.omit ().

library(dplyr)# Exclude the missing observationsdf_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 meanaverage_missing <- apply(df_titanic[,colnames(df_titanic) %in% list_na],2,mean,na.rm = TRUE)average_missing

Пояснение к коду:

Мы передаем 4 аргумента в метод apply.

  • df: df_titanic [, имена столбцов (df_titanic)% в% 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 mediandf_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 (возраст), average_missing [1], возраст)
  • replace_mean_fare = ifelse (is.na (тариф), average_missing [2], тариф)

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

sum(is.na(df_titanic_replace$age))

Выход:

## [1] 263

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

sum(is.na(df_titanic_replace$replace_mean_age))

Выход:

## [1] 0 

В исходном столбце age 263 пропущенных значения, а во вновь созданной переменной они заменены средним значением переменной age.

Шаг 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 meandf_titanic_impute_mean < -data.frame(sapply(df_titanic,function(x) ifelse(is.na(x),mean(x, na.rm = TRUE),x)))

Резюме

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

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

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

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

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

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