分组然后计算缺失的变量?

时间:2016-02-12 13:46:45

标签: r dplyr

我的数据看起来像这样:

df1 <- data.frame(
  Z = sample(LETTERS[1:5], size = 10000, replace = T),
  X1 = sample(c(1:10,NA), 10000, replace = T),
  X2 = sample(c(1:25,NA), 10000, replace = T),
  X3 = sample(c(1:5,NA), 10000, replace = T)
)

我可以用以下方法计算缺失的变量:

data.frame("Total Missing" = colSums(is.na(df1))) 

但是,我想通过Z来做到这一点。也就是说,每个Z值的缺失X1-3的数量。

我试过这个

df1 %>% group_by(Z) %>% summarise('Total Missing' = colSums(is.na(df1)))

但它没有按照我的预期发挥作用。

1 个答案:

答案 0 :(得分:5)

您可以使用summarise_each

df1 %>% 
  group_by(Z) %>% 
  summarise_each(funs(sum(is.na(.))))
#Source: local data frame [5 x 4]
#
#       Z    X1    X2    X3
#  (fctr) (int) (int) (int)
#1      A   169    77   334
#2      B   170    77   316
#3      C   159    78   348
#4      D   181    79   326
#5      E   174    69   341

请注意,您可以在summarise_each内指定要应用函数的列(默认为除分组列之外的所有列)或函数应用于哪些列。您可能还有一点很有意思,例如summarise_eachsummarise,如果您想要将函数应用于mutate_each那么mutate也是library(data.table) setDT(df1)[, lapply(.SD, function(x) sum(is.na(x))), by = Z] # Z X1 X2 X3 #1: D 181 79 326 #2: C 159 78 348 #3: B 170 77 316 #4: A 169 77 334 #5: E 174 69 341 的补充。所有列都没有总结结果。

强制性data.table等效于:

do.call(rbind,
        lapply(
          split(df1, df1$Z), function(dd) {
            colSums(is.na(dd[-1]))
          }))
#   X1 X2  X3
#A 169 77 334
#B 170 77 316
#C 159 78 348
#D 181 79 326
#E 174 69 341

在基础R中,您可以使用分割/应用/组合方法,如下所示:

aggregate

或者,在基地R中,您可以使用aggregate(df1[-1], list(df1$Z), FUN = function(y) sum(is.na(y))) aggregate(. ~ Z, df1, FUN = function(y) sum(is.na(y)), na.action = "na.pass") # formula interface

{{1}}