Як замінити відсутні значення (NA) у R: na.omit & na.rm
Відсутні значення в науці про дані виникають, коли спостереження відсутнє в стовпці кадру даних або містить символьне значення замість числового значення. Відсутні значення потрібно викинути або замінити, щоб зробити правильний висновок з даних.
У цьому посібнику ми навчимося працювати з відсутніми значеннями за допомогою бібліотеки 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 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(age), average_missing[1], age)
- 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)))
Підсумки
У нас є три методи роботи з відсутніми значеннями:
- Виключіть усі відсутні спостереження
- Врахувати середнє значення
- Врахувати медіану
У наведеній нижче таблиці підсумовано, як видалити всі відсутні спостереження
Library | Мета | код |
---|---|---|
база | Перелічіть відсутні спостереження |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Видаліть усі відсутні значення |
na.omit(df) |
Врахування середнього значення або медіани можна виконати двома способами
- Використання застосувати
- Використання сапплі
Метод | ПОДРОБИЦІ | Переваги | Недоліки |
---|---|---|---|
Крок за кроком із застосуванням | Перевірити стовпці з відсутніми, обчислити середнє/медіану, зберегти значення, замінити на mutate() | Ви знаєте значення середнього/медіани | Більший час виконання. Може бути повільним із великим набором даних |
Швидкий спосіб із застосуванням | Використовуйте sapply() і data.frame() для автоматичного пошуку та заміни відсутніх значень на середнє/медіане | Короткий код і швидко | Не знаю вписаних значень |