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()相符```价值观。