我正在尝试查找行中缺失值中的模式。
例如,如果我有此数据集:
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)
我希望输出结果如上所示。到目前为止,我发现的是行中缺失值的频率,但是我期望缺失值的模式和位置。
答案 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()
基本上也可以满足您的要求,但是返回一个矩阵,在行名中包含一些有用的信息,因此需要进行一些处理才能切入数据帧。