Как да замените липсващи стойности (NA) в R: na.omit & na.rm
Липсващи стойности в науката за данни възникват, когато едно наблюдение липсва в колона на рамка от данни или съдържа символна стойност вместо числова стойност. Липсващите стойности трябва да бъдат премахнати или заменени, за да се направи правилно заключение от данните.
В този урок ще научим как да се справяме с липсващи стойности с библиотеката dplyr. Библиотеката dplyr е част от екосистема за реализиране на анализ на данни.
В този урок ще научите
- mutate()
- Изключване на липсващи стойности (NA)
- Приписване на липсващи стойности (NA) със средната стойност и медианата
mutate()
Четвъртият глагол в 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 с оригиналния набор от данни.
Вменете липсващите данни със средната стойност и медианата
Можем също така да вменим (попълним) липсващи стойности с медианата или средната стойност. Добра практика е да създадете две отделни променливи за средната стойност и медианата. Веднъж създадени, можем да заменим липсващите стойности с новоформираните променливи.
Ще използваме метода на прилагане, за да изчислим средната стойност на колоната с 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(възраст), средна_липсваща[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 липсващи стойности, докато новосъздадената променлива ги е заменила със средната стойност на възрастта на променливата.
Стъпка 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)))
Oбобщение
Имаме три метода за справяне с липсващи стойности:
- Изключете всички липсващи наблюдения
- Приписване със средната стойност
- Приписване с медианата
Следната таблица обобщава как да премахнете всички липсващи наблюдения
Библиотека | Цел | код |
---|---|---|
база | Избройте липсващите наблюдения |
colnames(df)[apply(df, 2, anyNA)] |
dplyr | Премахнете всички липсващи стойности |
na.omit(df) |
Импутацията със средна стойност или медиана може да се извърши по два начина
- Използване на apply
- Използване на sapply
Начин на доставка | Детайли | Предимства | Недостатъци |
---|---|---|---|
Стъпка по стъпка с прилагане | Проверете колоните с липсващи, изчислете средна/медиана, запазете стойността, заменете с mutate() | Знаете стойността на средно/медиана | Повече време за изпълнение. Може да бъде бавен с голям набор от данни |
Бърз начин с приложение | Използвайте sapply() и data.frame() за автоматично търсене и заместване на липсващи стойности със средна/медиана | Кратък код и бързо | Не знам стойностите на импутацията |