Элегантный способ сообщить о пропущенных значениях в данных.рамка


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

for (Var in names(airquality)) {
    missing <- sum(is.na(airquality[,Var]))
    if (missing > 0) {
        print(c(Var,missing))
    }
}

Edit: я имею дело с данными.фреймы с десятками до сотен переменных, поэтому важно, чтобы мы сообщали только переменные с пропущенными значениями.

11 61

11 ответов:

просто использовать sapply

> sapply(airquality, function(x) sum(is.na(x)))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0

вы также можете использовать apply или colSums на матрице, созданной is.na()

> apply(is.na(airquality),2,sum)
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0
> colSums(is.na(airquality))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0 

более емкий-: sum(is.na(x[1]))

что это

  1. x[1] посмотрите на первый столбец

  2. is.na() true, если NA

  3. sum()TRUE и 1,FALSE и 0

можно использовать map_df С purrr.

library(mice)
library(purrr)

# map_df with purrr
map_df(airquality, function(x) sum(is.na(x)))
# A tibble: 1 × 6
# Ozone Solar.R  Wind  Temp Month   Day
# <int>   <int> <int> <int> <int> <int>
# 1    37       7     0     0     0     0

еще одна графическая альтернатива - отличное DataExplorer пакет:

enter image description here

Docs также указывает на то, что вы можете сохранить результаты для дополнительного анализа с missing_data <- plot_missing(data).

summary(airquality)

уже дает вам эту информацию

The ВИМ пакеты также предлагает некоторые хорошие недостающие данные участок для данных.кадр

library("VIM")
aggr(airquality)

enter image description here

еще одна функция, которая поможет вам взглянуть на отсутствующие данные, будет df_status из библиотеки funModeling

library(funModeling)

Айрис.2-это набор данных iris с некоторыми добавленными NAs.Вы можете заменить его своим набором данных.

df_status(iris.2)

это даст вам количество и процент NAs в каждом столбце.

мой новый фаворит для (не слишком широких) данных-это методы из excellent naniar пакета. Вы получаете не только частоты, но и паттерны пропускания:

library(naniar)
library(UpSetR)

riskfactors %>%
  as_shadow_upset() %>%
  upset()

enter image description here

это часто полезно, чтобы увидеть, где пропуски по отношению к не хватает, которые могут быть достигнуты путем построения диаграммы рассеяния с пропусками:

ggplot(airquality,
       aes(x = Ozone,
           y = Solar.R)) +
 geom_miss_point()

enter image description here

или для категорийных переменные:

gg_miss_fct(x = riskfactors, fct = marital)

enter image description here

эти примеры-из пакета виньетка это список других интересных визуализаций.

для еще одного графического решения,visdatпакета предложения vis_miss.

library(visdat)
vis_miss(airquality)

enter image description here

очень похоже на Amelia выход с небольшой разницей давая %s на пропусках из коробки.

еще один графический и интерактивный способ использовать

Если вы хотите сделать это для конкретного столбца, то вы также можете использовать этот

length(which(is.na(airquality[1])==T))

Я думаю, что библиотека Amelia делает хорошую работу в обработке отсутствующих данных также включает в себя карту для визуализации отсутствующих строк.

install.packages("Amelia")
library(Amelia)
missmap(airquality)

enter image description here

вы также можете запустить следующий код, который вернет логические значения na

row.has.na <- apply(training, 1, function(x){any(is.na(x))})