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

标签 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)))

但它并没有像我预期的那样工作。

最佳答案

你可以使用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 的补充> 如果您想将函数应用于所有列而不汇总结果。

强制性的 data.table 等效项是:

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

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

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

或者,同样在 base R 中,您可以使用 aggregate:

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

关于r - 分组然后计算缺失的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35364196/

相关文章:

r - Sweave/knitr 实现中的 mean 和 sem 函数

R:如何根据多个条件和汇总表求和

r - 为 dplyr do 操作的列表输出分配名称

r - sum 和 + 之间的不同输出

r - R 中 seq() 函数的管道运算符 %>% 错误

python - 在 Python/R 中创建节点-边三角形邻接图

r - 在不同方面手动注释具有不同标签的 ggplot

r - 检查 R 中向量的哪些元素位于另一个向量的元素之间

R:如何识别未知数的组合?

r - 带有百分比标签的 Ggplot 堆积条形图