Як замінити відсутні значення (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 з даних легко, але це не означає, що це найелегантніше рішення. Під час аналізу доцільно використовувати різні методи для роботи з відсутніми значеннями

Щоб вирішити проблему відсутніх спостережень, ми використаємо титанічний набір даних. У цьому наборі даних ми маємо доступ до інформації про пасажирів на борту під час трагедії. Цей набір даних містить багато 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() для автоматичного пошуку та заміни відсутніх значень на середнє/медіане Короткий код і швидко Не знаю вписаних значень