Dplyr按组的行计数(不包括零)

时间:2019-04-12 05:35:13

标签: r dplyr

我有以下数据集:

Handler

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

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")

我尝试使用dplyr,但不确定在值不为零的情况下如何获取计数。我不确定是否应该将所有ZEROS都转换为NA,这似乎不是很直观……还是应该使用filter删除零。

  BRAND VARIANT Noodles Peas milk
1 BRANDA    VAR1      4   2   5

2 个答案:

答案 0 :(得分:3)

如果我们想找出所有其余列的非零计数,我们可以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

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

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

或以基数R aggregate

aggregate(.~BRAND + VARIANT, df, function(x) sum(x != 0))

答案 1 :(得分:0)

我们可以使用data.table使用

library(data.table)
setDT(df)[, lapply(.SD, function(x) sum(x != 0)), .(BRAND, VARIANT)]