我正在尝试识别数据集行中缺失值的模式

时间:2019-05-22 00:19:50

标签: r

我正在尝试查找行中缺失值中的模式。

例如,如果我有此数据集:

        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行缺少变量b中的1个值,依此类推。

我尝试在Extracat包(归档版本)中使用subtable()函数,但无法在每个变量中找到缺失值的位置。我只能找到频率。

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

我希望输出结果如上所示。到目前为止,我发现的是行中缺失值的频率,但是我期望缺失值的模式和位置​​。

2 个答案:

答案 0 :(得分:1)

这是一种整洁的方法。 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

答案 1 :(得分:1)

使用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()基本上也可以满足您的要求,但是返回一个矩阵,在行名中包含一些有用的信息,因此需要进行一些处理才能切入数据帧。