计算每个类的缺失值

时间:2018-01-09 12:03:07

标签: r dplyr

我希望根据数据中的类标签(因变量)来检查缺失值的模式。我想要的输出是类标签和类中缺失值的数量。

library(tidyverse)

fakeData <- data.frame(var1 = c(1,2,NA,4,NA,6,7,8,9,10),
                       var2=c(11,NA,NA,14,NA,16,17,NA,19,NA), 
                       Class = c(rep("A", 5), rep("B", 5)))

fakeData %>% group_by(Class) %>% summarize(numMissing = sum(is.na())) 

Error in summarise_impl(.data, dots) : 
Evaluation error: 0 arguments passed to 'is.na' which requires 1.

我的做法有什么问题?

3 个答案:

答案 0 :(得分:1)

也许,我们可以做到

fakeData %>%
      group_by(Class) %>%
      summarise_all(funs(sum(is.na(.)))) %>%
      transmute(Class, numMissing = var1 + var2)

如果我们有很多列,请使用purrr::reduce

fakeData %>%
    group_by(Class) %>% 
    summarise_all(funs(sum(is.na(.)))) %>% 
    transmute(Class, numMissing = .[-1] %>% reduce(`+`))
    #or with rowSums
    #transmute(Class, numMissing = rowSums(.[-1]))

答案 1 :(得分:1)

我认为这是一个更清洁的解决方案,仅使用tidyverse。您不需要知道列数。您还可以使用?select_helpers中的gather()来选择列,例如。 starts_with("var")

fakeData %>% 
  group_by(Class) %>% 
  gather(variable, value, -Class) %>% # all except Class 
  summarise(missing_n = sum(is.na(value)))

# A tibble: 2 x 2
  Class  missing_n
  <fctr>     <int>
1 A              5
2 B              2

答案 2 :(得分:0)

我建议使用reshape lib以长格式熔化数据集。然后只使用类变量的聚合函数。

library(reshape)

fakeData <- data.frame(var1 = c(1,2,NA,4,NA,6,7,8,9,10),
                       var2=c(11,NA,NA,14,NA,16,17,NA,19,NA), 
                       Class = c(rep("A", 5), rep("B", 5)))

fData <- melt(fakeData, measure.vars = c("var1", "var2"))

fData
   Class variable value
1      A     var1     1
2      A     var1     2
3      A     var1    NA
4      A     var1     4
5      A     var1    NA
6      B     var1     6
7      B     var1     7
8      B     var1     8
9      B     var1     9
10     B     var1    10
11     A     var2    11
12     A     var2    NA
13     A     var2    NA
14     A     var2    14
15     A     var2    NA
16     B     var2    16
17     B     var2    17
18     B     var2    NA
19     B     var2    19
20     B     var2    NA

with(fData, aggregate(value, list(Class), function(x) { sum(is.na(x)) }))
  Group.1 x
1       A 5
2       B 2