Вот небольшой фрагмент кода, который я написал для сообщения о переменных с отсутствующими значениями из фрейма данных. Я пытаюсь придумать более элегантный способ сделать это, возможно, вернув data.frame, но я застрял:
for (Var in names(airquality)) {
missing <- sum(is.na(airquality[,Var]))
if (missing > 0) {
print(c(Var,missing))
}
}
Изменить: я имею дело с data.frames с десятками и сотнями переменных, поэтому важно, чтобы мы сообщали только о переменных с отсутствующими значениями.
table
из символов, и вам нужно будет разобрать количество NA.Ответы:
Просто используйте
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
источник
M <- sapply(airquality, function(x) sum(is.na(x))); M[M>0]
M <- colSums(is.na(airquality)); M[M <= 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
источник
map_df
болееsapply
?map_df( air quality, ~sum(is.na(.) )
map_df
oversapply
только тогда, когда результат имеет много строк, поскольку выходной формат map_df всегда является тибблом.vapply
vssapply
в функциях, потому чтоvapply
дает вам известную структуру результата (которую вы указываете).sapply
может возвращать массив или список, в зависимости от вывода функции. Недостаткомmap_df
является то, что вы даете ему data.frame в качестве ввода, и он возвращает подкласс data.frame, а не data.frame. Нет гарантии, что таблицы будут вести себя так же, как data.frames, во всех необходимых случаях в будущем.Мой новый фаворит для (не слишком широких) данных - это методы из отличного пакета naniar . Вы получаете не только частоты, но и схемы отсутствия:
Часто бывает полезно увидеть, где пропущены по отношению к отсутствию, что может быть достигнуто путем построения графика рассеяния с пропусками:
Или для категориальных переменных:
Эти примеры взяты из виньетки пакета, в которой перечислены другие интересные визуализации.
источник
gg_miss_upset()
последней версии теперь есть специальная функция, которая будет передана CRAN, когда они вернутся из отпуска. naniar.njtierney.com/reference/gg_miss_upset.htmlуже дает вам эту информацию
В VIM пакеты также предлагают некоторые хорошие недостающий участок данных для data.frame
library("VIM") aggr(airquality)
источник
Более лаконично:
sum(is.na(x[1]))
То есть
x[1]
Посмотрите на первый столбецis.na()
правда, если этоNA
sum()
TRUE
есть1
,FALSE
есть0
источник
NA
s для всех столбцов в данныхЕще одна графическая альтернатива -
plot_missing
функция из отличногоDataExplorer
пакета:Docs также указывает на то, что вы можете сохранить эти результаты для дополнительного анализа с помощью
missing_data <- plot_missing(data)
.источник
plot_missing()
Функция вDataExplorer
пакете теперьPlotMissing()
.PlotMissing()
устарел. Пожалуйста, используйтеplot_missing()
вместо этого. См. # 49 для более подробной информации.Еще одна функция, которая поможет вам увидеть недостающие данные, - это df_status из библиотеки funModeling.
iris.2 - это набор данных радужки с некоторыми добавленными NA. Вы можете заменить его своим набором данных.
Это даст вам количество и процентное соотношение НП в каждом столбце.
источник
Еще одно графическое решение -
visdat
пакетные предложенияvis_miss
.Очень похоже на
Amelia
вывод с небольшой разницей в выдаче% s при отсутствии из коробки.источник
Я думаю, что библиотека Amelia отлично справляется с обработкой недостающих данных, а также включает карту для визуализации недостающих строк.
install.packages("Amelia") library(Amelia) missmap(airquality)
Вы также можете запустить следующий код, который вернет логические значения na
row.has.na <- apply(training, 1, function(x){any(is.na(x))})
источник
Другой графический и интерактивный способ - использовать
is.na10
функцию изheatmaply
библиотеки:library(heatmaply) heatmaply(is.na10(airquality), grid_gap = 1, showticklabels = c(T,F), k_col =3, k_row = 3, margins = c(55, 30), colors = c("grey80", "grey20"))
Вероятно, не будет работать с большими наборами данных.
источник
Если вы хотите сделать это для определенного столбца, вы также можете использовать этот
length(which(is.na(airquality[1])==T))
источник
Функцию пакета ExPanDaR
prepare_missing_values_graph
можно использовать для исследования панельных данных:источник
dplyr
Решение , чтобы получить количество может быть:summarise_all(df, ~sum(is.na(.)))
Или получить процент:
summarise_all(df, ~(sum(is_missing(.) / nrow(df))))
Возможно, также стоит отметить, что отсутствующие данные могут быть некрасивыми, непоследовательными и не всегда закодированы в
NA
зависимости от источника или того, как они обрабатываются при импорте. Следующая функция может быть изменена в зависимости от ваших данных и того, что вы хотите считать пропущенным:is_missing <- function(x){ missing_strs <- c('', 'null', 'na', 'nan', 'inf', '-inf', '-9', 'unknown', 'missing') ifelse((is.na(x) | is.nan(x) | is.infinite(x)), TRUE, ifelse(trimws(tolower(x)) %in% missing_strs, TRUE, FALSE)) } # sample ugly data df <- data.frame(a = c(NA, '1', ' ', 'missing'), b = c(0, 2, NaN, 4), c = c('NA', 'b', '-9', 'null'), d = 1:4, e = c(1, Inf, -Inf, 0)) # counts: > summarise_all(df, ~sum(is_missing(.))) a b c d e 1 3 1 3 0 2 # percentage: > summarise_all(df, ~(sum(is_missing(.) / nrow(df)))) a b c d e 1 0.75 0.25 0.75 0 0.5
источник