按组计算总缺失值?

J. *_*ler 5 group-by r na 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))
Run Code Online (Sandbox Code Playgroud)

正如一位用户建议的那样,可以使用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  
Run Code Online (Sandbox Code Playgroud)

但是,我只想获取每组缺失值的总数。

我也尝试过这个,但它不起作用:R count NA by group

理想情况下,它应该给我类似的东西:

#       Z    sumNA 
#  (fctr)   (int) 
#1      A    580
#2      B    493
#3      C    585
#4      D    586
#5      E    584  
Run Code Online (Sandbox Code Playgroud)

提前致谢。

DJV*_*DJV 8

您可以使用该tidyverse方法。

require(tidyverse)
#Sample data
dat <- data.frame(group = rep(c("a", "b", "c", "d", "g"), 3), 
                  y = rep(c(1, NA, 2, NA, 3), 3))


dat %>% 
  group_by(group) %>% 
  summarise(sumNA = sum(is.na(y)))
Run Code Online (Sandbox Code Playgroud)

输出:

  group sumNA
  <fct> <int>
1 a         0
2 b         3
3 c         0
4 d         3
5 g         0
Run Code Online (Sandbox Code Playgroud)

编辑

但是,如果您有多个列,则可以使用summarize_all(或者summarize_at如果您想指定列;感谢 @bschneidr 的评论):

#Sample data
set.seed(123)
dat <- data.frame(group = sample(letters[1:4], 10, replace = T), 
                  x = sample(c(1,NA), 10, replace = T), 
                  y = sample(c(1,NA), 10, replace = T), 
                  z = sample(c(1, NA), 10, replace = T))

dat %>% 
  group_by(group) %>% 
  summarize_all(.funs = funs('NA' = sum(is.na(.))))

# A tibble: 4 x 4
  group  x_NA  y_NA  z_NA
  <fct> <int> <int> <int>
1 a         1     1     0
2 b         3     2     2
3 c         0     1     1
4 d         1     4     2
Run Code Online (Sandbox Code Playgroud)


Ice*_*can 2

data.table解决方案

library(data.table)
setDT(df1)

df1[, .(sumNA = sum(is.na(.SD))), by = Z]

#    Z sumNA
# 1: A   559
# 2: C   661
# 3: E   596
# 4: B   597
# 5: D   560
Run Code Online (Sandbox Code Playgroud)

dplyr解决方案使用rowSums(.[-1]),即除第一列之外的所有列的行总和。

library(dplyr)

df1 %>% 
  group_by(Z) %>% 
  summarise_all(~sum(is.na(.))) %>% 
  transmute(Z, sumNA = rowSums(.[-1]))

# # A tibble: 5 x 2
#   Z     sumNA
#   <fct> <dbl>
# 1 A       559
# 2 B       597
# 3 C       661
# 4 D       560
# 5 E       596
Run Code Online (Sandbox Code Playgroud)