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