Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 分组,然后计算缺少的变量?_R_Dplyr - Fatal编程技术网

R 分组,然后计算缺少的变量?

R 分组,然后计算缺少的变量?,r,dplyr,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) ) 但是,我想通过Z来说明这一点。也就是说,每

我的数据如下所示:

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)
)
但是,我想通过
Z
来说明这一点。也就是说,每个Z值缺少X1-3的数量

我试过这个

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

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

您可以使用
对每个
进行总结:

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
请注意,您可以在
summary_each
中指定要将函数应用于哪些列(默认为除分组列以外的所有列)或不应将函数应用于哪些列。您可能还感兴趣地注意到,与
summary_each
summary
一样,如果您希望将函数应用于所有列而不汇总结果,还可以使用
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
在base 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(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
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