R 我试图识别数据集中行中缺失值的模式

R 我试图识别数据集中行中缺失值的模式,r,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列中缺失值的

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

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

        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行缺失变量c和d的2个值;第二行:变量b中的1行缺少1个值,依此类推

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

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


rowmiss这里有一个整洁的方法。
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
库(tidyverse)
df%>%
rowid_到_列()%>%
聚集(列,值,-rowid)%>%
突变(val=is.na(val)*1)%>%
分组依据(rowid)%%>%变异(m=sum(val))%%>%ungroup()%%
排列(列,值)%>%
突变(n=1)%>%
选择(n,a:d,m)
#一个tibble:3x6
n a b c d m
1     1     0     0     1     1     2
2     1     0     1     0     0     1
3     1     0     1     0     1     2

这里有一个整洁的方法。
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
库(tidyverse)
df%>%
rowid_到_列()%>%
聚集(列,值,-rowid)%>%
突变(val=is.na(val)*1)%>%
分组依据(rowid)%%>%变异(m=sum(val))%%>%ungroup()%%
排列(列,值)%>%
突变(n=1)%>%
选择(n,a:d,m)
#一个tibble:3x6
n a b c d m
1     1     0     0     1     1     2
2     1     0     1     0     0     1
3     1     0     1     0     1     2

使用
tidyverse执行此操作的另一种方法是:

library(tidyverse)

df %>%
    mutate_all(~ is.na(.) %>% as.numeric()) %>%
    mutate(m = rowSums(.)) %>%
    group_by_all() %>%
    count() 
输出(如果进一步使用
df
,您可能还需要
ungroup()
):

#一个tible:3 x 6
#组:a、b、c、d、m[3]
a b c d m n
1     0     0     1     1     2     1
2     0     1     0     0     1     1
3     0     1     0     1     2     1

mices::md.pattern()
基本上也可以实现您想要的功能,但会返回一个包含行名中一些有用信息的矩阵,因此需要进行一些处理才能进入数据帧。

使用
tidyverse
实现此功能的另一种方法:

library(tidyverse)

df %>%
    mutate_all(~ is.na(.) %>% as.numeric()) %>%
    mutate(m = rowSums(.)) %>%
    group_by_all() %>%
    count() 
输出(如果进一步使用
df
,您可能还需要
ungroup()
):

#一个tible:3 x 6
#组:a、b、c、d、m[3]
a b c d m n
1     0     0     1     1     2     1
2     0     1     0     0     1     1
3     0     1     0     1     2     1

mices::md.pattern()
基本上也可以实现您想要的功能,但会返回一个包含行名中一些有用信息的矩阵,因此需要进行一些处理才能进入数据帧。

naniar
包提供了一些有趣的方法来查看缺失模式,像
nabular
函数:
naniar
包提供了一些有趣的方法来查看丢失模式,像
nabular
函数:
n
是按
is.na(dat[c(“a”、“b”、“c”、“d”))分组的行数。
我想@Jon,这个建议很好,但是当我使用大型数据集时,
m
列中的值并不是我真正想要的。我对此感到困惑。它们与您期望的输出或其他答案不同吗?
n
是按
is.na(dat[c(“a”、“b”、“c”、“d”)])分组的行数。
我认为@Jon,这个建议很好,但是
m列中的值并不是我使用大型数据集时真正想要的值。我对此感到困惑。它们与您期望的输出或其他答案不同吗?此建议完全符合我的要求,当我在频率表中分组值时,我的结果与``md.pattern()``值相符。此建议完全符合我的要求,当我在频率表中分组值时,我的结果与``md.pattern()相符```价值观。