Dplyr 按组计数,不包括零

Apr*_*cot 3 r dplyr

我有以下数据集:

structure(list(BRAND = c("BRANDA", "BRANDA", "BRANDA", "BRANDA", 
                         "BRANDA"), VARIANT = c("VAR1", "VAR1", "VAR1", 
                                                  "VAR1", "VAR1"), Noodles = c(20L, 100L, 10L, 0L, 
                                                                                              50L), Peas = c(14L, 0L, 0L, 0L, 14L), milk = c(1710L, 468L, 
                                                                                                                                                   1020L, 585L, 1710L)), row.names = c(NA, 5L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

我正在尝试为每个产品列导出非零的行数。所需的输出如下:

  BRAND VARIANT Noodles Peas milk
1 BRANDA    VAR1      4   2   5
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用 dplyr,但不确定如何获取值不为零的计数。我不确定是否应该将所有零转换为 NA,这看起来不太直观……或者我是否应该使用过滤器来删除零。

a <- ndf %>%  group_by(BRAND, VARIANT)  %>% summarise_all(funs(n()))
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 5

如果我们想找出所有剩余列的非零计数,我们可以group_by BRAND和 VARIANT 使用summarise_all

library(dplyr)

df %>%
  group_by(BRAND, VARIANT) %>%
  summarise_all(~sum(. != 0))

#   BRAND  VARIANT Noodles  Peas  milk
#   <chr>  <chr>     <int> <int> <int>
#1 BRANDA VAR1          4     2     5
Run Code Online (Sandbox Code Playgroud)

如果还有其他一些列并且您有兴趣仅为特定列计算非零值,我们可以summarise_at类似地使用

df %>%
  group_by(BRAND, VARIANT) %>%
  summarise_at(vars(Noodles, Peas, milk), ~sum(. != 0))
Run Code Online (Sandbox Code Playgroud)

或与基地 R aggregate

aggregate(.~BRAND + VARIANT, df, function(x) sum(x != 0))
Run Code Online (Sandbox Code Playgroud)