代码之家  ›  专栏  ›  技术社区  ›  buzaku

计算每个类缺少的值

  •  2
  • buzaku  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   pasipasi    7 年前

    我认为这是一个更干净的解决方案,只使用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
  •  1
  •   akrun    7 年前

    也许我们能做到

    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]))
    
        3
  •  0
  •   gaspers    7 年前

    我建议使用重塑库以长格式融合数据集。然后只需按类变量使用聚合函数。

    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