Существующая функция для нахождения количества пропущенных и завершенных обращений

#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