Я пытаюсь определить шаблоны пропущенных значений в строках набора данных - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь найти шаблоны в пропущенных значениях в строках.

Например, если у меня есть этот набор данных:

        a   b    c    d
        1   0.1  NA   NA
        2   NA   3    4
        5   NA   6    NA

Я ожидаю, что результат будет:

      n  a   b  c   d  m
      1  0   0  1   1  2
      1  0   1  0   0  1
      1  0   1  0   1  2

где столбец n показывает количество пропущенных значений строк в столбце m, а 1 указывает пропущенные значения (за исключением столбцов n и m). То есть интерпретация первой строки выходных данных выглядит следующим образом: отсутствует 1 строка 2 значения для переменных c и d; вторая строка: в 1 строке отсутствует 1 значение в переменной b и т. д.

Я пытался использовать функцию subtable () в пакете extracat (в архивной версии), но не могу найти места пропущенных значений в каждой переменной. Я могу только найти частоты.

rowmiss<-rowSums(is.na(dat1[1:ncol(dat1)]))
r1<-matrix(rowmiss, nrow=nrow(dat1))
subtable(rowmiss,1)

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

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Альтернативный способ сделать это с tidyverse:

library(tidyverse)

df %>%
    mutate_all(~ is.na(.) %>% as.numeric()) %>%
    mutate(m = rowSums(.)) %>%
    group_by_all() %>%
    count() 

Вывод (вы также можете захотеть ungroup(), если будете делать что-то еще с df):

# A tibble: 3 x 6
# Groups:   a, b, c, d, m [3]
      a     b     c     d     m     n
  <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1     0     0     1     1     2     1
2     0     1     0     0     1     1
3     0     1     0     1     2     1

mice::md.pattern() также делает в основном то, что вы хотите, но возвращает матрицу с некоторой полезной информацией в именах строк, поэтому потребуется немного обработки для объединения в фрейм данных.

1 голос
/ 22 мая 2019

Вот такой подход. Столбец n кажется избыточным, стоит ли делать что-то еще?

library(tidyverse)
df %>%
  rowid_to_column() %>%
  gather(col, val, -rowid) %>%
  mutate(val = is.na(val) * 1) %>%
  group_by(rowid) %>% mutate(m = sum(val)) %>% ungroup() %>%
  spread(col, val) %>%
  mutate(n = 1) %>%
  select(n, a:d, m)

# A tibble: 3 x 6
      n     a     b     c     d     m
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1     0     0     1     1     2
2     1     0     1     0     0     1
3     1     0     1     0     1     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...