Учебники

17) Заменить недостающие значения в R

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

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

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

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

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

Чтобы решить проблему пропущенных наблюдений, мы будем использовать набор данных титанов. В этом наборе данных у нас есть доступ к информации о пассажирах на борту во время трагедии. Этот набор данных имеет много 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)% в% 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 пропущенных значения, в то время как вновь созданная переменная заменила их на среднее значение переменной 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 does not create a data frame, so we can wrap the sapply() function within data.frame() to create a data frame object.

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

Summary

We have three methods to deal with missing values:

  • Exclude all of the missing observations
  • Impute with the mean
  • Impute with the median

The following table summarizes how to remove all the missing observations

Library Objective Code
base List missing observations
colnames(df)[apply(df, 2, anyNA)]
dplyr Remove all missing values
na.omit(df)

Imputation with mean or median can be done in two ways

  • Using apply
  • Using sapply
Method Details Advantages Disadvantages
Step by step with apply Check columns with missing, compute mean/median, store the value, replace with mutate() You know the value of means/median More execution time. Can be slow with big dataset
Quick way with sapply Use sapply() and data.frame() to automatically search and replace missing values with mean/median Short code and fast Don’t know the imputation values