如何使用dplyr计算每列中的零?

pac*_*ese 2 r dplyr

我想计算数据帧中的零。

计算我正在使用的 NA

mtcars %>% group_by(cyl) %>% summarise_each(funs(sum(is.na(.))))
Run Code Online (Sandbox Code Playgroud)

返回

# A tibble: 3 × 11
    cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
  <dbl> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1     4     0     0     0     0     0     0     0     0     0     0
2     6     0     0     0     0     0     0     0     0     0     0
3     8     0     0     0     0     0     0     0     0     0     0
Run Code Online (Sandbox Code Playgroud)

我怎么能做类似的事情

mtcars %>% group_by(cyl) %>% summarise_each(funs(sum(identical(.,0)))
Run Code Online (Sandbox Code Playgroud)

达到相同的结果但计数零而不是 NAs?

zac*_*dav 7

因为.在这种情况下将是一个向量,您可以只使用逻辑测试,sum因为TRUE被视为 1 并且FALSE是 0。

mtcars %>% 
    group_by(cyl) %>% 
    summarise_each(funs(sum(.==0)))

    cyl   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
  (dbl) (int) (int) (int) (int) (int) (int) (int) (int) (int) (int)
1     4     0     0     0     0     0     0     1     3     0     0
2     6     0     0     0     0     0     0     3     4     0     0
3     8     0     0     0     0     0     0    14    12     0     0
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

我们也可以在 base R

aggregate(.~cyl, mtcars, FUN = function(x) sum(x==0))
#  cyl mpg disp hp drat wt qsec vs am gear carb
#1   4   0    0  0    0  0    0  1  3    0    0
#2   6   0    0  0    0  0    0  3  4    0    0
#3   8   0    0  0    0  0    0 14 12    0    0
Run Code Online (Sandbox Code Playgroud)

或与 rowsum

rowsum(+(mtcars[-2]==0), group = mtcars$cyl)
#     mpg disp hp drat wt qsec vs am gear carb
#4   0    0  0    0  0    0  1  3    0    0
#6   0    0  0    0  0    0  3  4    0    0
#8   0    0  0    0  0    0 14 12    0    0
Run Code Online (Sandbox Code Playgroud)

或与 data.table

library(data.table)
as.data.table(mtcars)[, lapply(.SD, function(x) sum(x==0)) , cyl]
Run Code Online (Sandbox Code Playgroud)