#r #dataframe #missing-data
#r #фрейм данных #отсутствует -данные
Вопрос:
Постановка задачи
Есть ли в существующем пакете функция, которая относительно легко выдает количество пропущенных элементов (т.Е. NA
‘s) и Количество полных элементов для каждого столбца фрейма данных?
Я могу решить эту проблему с помощью подхода, упомянутого ниже, однако мне было интересно, существует ли пакет, который сделает это за меня (в основном для удобства не повторять этот код каждый раз, когда я выполняю анализ данных).
Текущее решение 1
Я могу узнать эту информацию, используя следующие функции, которые я написал
# Find number of missing elements
missing.total = function(df){
sum(is.na(df))
}
# Find number of complete elements
complete.total = function(df){
sum(!is.na(df))
}
# Find number of complete and missing elements for each variable in a data frame
var.complete.info = function(df){
result = cbind( apply(df, 2, complete.total),
apply(df, 2, missing.total) )
colnames(result) = c("Complete", "Missing")
return(result)
}
Мы можем применить эту функцию в следующем примере:
set.seed(1)
n.col = 5
n.row = 100
sample.set = c(0:9, NA)
# Create sample data frame with missing and complete
sample.df = data.frame(replicate(n.col,sample(sample.set,n.row,rep=TRUE)))
> var.complete.info(sample.df)
Complete Missing
X1 95 5
X2 92 8
X3 89 11
X4 88 12
X5 86 14
Текущее решение 2
Другой вариант — использовать skim()
функцию в skimr
библиотеке, но это дает слишком много информации:
library(skimr)
# Using sample.df as defined above in solution 1
# Gives more information than necessary
> skim(sample.df)
Skim summary statistics
n obs: 100
n variables: 5
── Variable type:integer ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
variable missing complete n mean sd p0 p25 p50 p75 p100 hist
X1 5 95 100 4.96 2.79 0 3 5 7 9 ▅▃▃▅▃▂▅▇
X2 8 92 100 4.75 2.72 0 2.75 5 7 9 ▆▃▅▅▃▆▃▇
X3 11 89 100 3.57 2.51 0 1 3 5 9 ▇▃▃▃▃▂▂▂
X4 12 88 100 4.3 2.78 0 2 4 7 9 ▇▃▅▅▅▂▃▆
X5 14 86 100 4.26 2.9 0 1.25 4 7 9 ▇▂▂▅▅▂▃▅
Идеальное решение
Я ищу существующий пакет, который выполнит всю работу за меня, поэтому я надеюсь найти пакет, который позволит мне кодировать следующим образом:
library(Package_I_am_not_aware_of)
existing.function(data_frame)
Комментарии:
1. Возможно, вы захотите изучить
VIM
пакеты, в которых есть хорошие функции обработки пропущенных обращений.
Ответ №1:
Возможно VIM::aggr()
, вам подойдет.
library(VIM)
summary(aggr(d, plot=FALSE))
# Missings per variable:
# Variable Count
# X1 7
# X2 9
# X3 10
# X4 14
#
# Missings in combinations of variables:
# Combinations Count Percent
# 0:0:0:0 5 16.666667
# 0:0:0:1 3 10.000000
# 0:0:1:0 3 10.000000
# 0:0:1:1 3 10.000000
# 0:1:0:0 4 13.333333
# 0:1:0:1 3 10.000000
# 0:1:1:0 1 3.333333
# 0:1:1:1 1 3.333333
# 1:0:0:0 2 6.666667
# 1:0:0:1 3 10.000000
# 1:0:1:0 1 3.333333
# 1:0:1:1 1 3.333333
Чтобы получить только верхнюю часть, вы можете извлечь значения, сохраненные в a data.frame
.
out <- summary(aggr(d, plot=FALSE))
out$missings
# Variable Count
# X1 X1 7
# X2 X2 9
# X3 X3 10
# X4 X4 14
Данные
d <- structure(list(X1 = c(NA, 2L, 3L, 4L, 5L, 6L, 7L, NA, 9L, 10L,
11L, 12L, NA, NA, 15L, NA, 17L, NA, 19L, 20L, 21L, 22L, 23L,
24L, 25L, 26L, 27L, NA, 29L, 30L), X2 = c(31L, 32L, 33L, NA,
NA, 36L, NA, 38L, 39L, 40L, 41L, NA, 43L, 44L, 45L, 46L, 47L,
48L, NA, NA, NA, 52L, 53L, 54L, 55L, 56L, NA, 58L, 59L, NA),
X3 = c(61L, 62L, 63L, 64L, 65L, 66L, NA, 68L, 69L, 70L, NA,
72L, NA, NA, NA, 76L, NA, 78L, NA, 80L, 81L, 82L, 83L, NA,
NA, NA, 87L, 88L, 89L, 90L), X4 = c(NA, NA, 93L, 94L, 95L,
96L, NA, NA, NA, 100L, NA, NA, 103L, NA, 105L, NA, 107L,
108L, 109L, NA, NA, NA, 113L, 114L, NA, NA, 117L, 118L, 119L,
120L)), class = "data.frame", row.names = c(NA, -30L))
Комментарии:
1. Возможно ли просто изолировать верхнюю часть (т. Е. Только раздел «Пропуски по переменной:» без раздела «Пропуски в комбинациях переменных:»)?
Ответ №2:
С skimr
помощью мы можем фактически изменить сводные функции по умолчанию, используя skim_with
:
library(skimr)
funs <- get_skimmers()$numeric
skim_with(integer = list(Complete = funs$complete, Missing = funs$missing), append = FALSE)
skim(sample.df)
Вывод:
Skim summary statistics
n obs: 100
n variables: 5
-- Variable type:integer ----------------------------------------------------------------------------------------------------------
variable Complete Missing
X1 95 5
X2 92 8
X3 89 11
X4 88 12
X5 86 14