Dplyr количество строк по группе, исключая нули - PullRequest
2 голосов
/ 12 апреля 2019

У меня есть следующий набор данных:

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

Я пытаюсь определить количество строк с ненулевыми значениями для каждого столбца продукта. Желаемый вывод выглядит следующим образом:

  BRAND VARIANT Noodles Peas milk
1 BRANDA    VAR1      4   2   5

Я пытался использовать dplyr, но не уверен, как получить счетчик, где значения не равны нулю. Я не уверен, стоит ли мне конвертировать все нули в NA, что не очень интуитивно понятно ... или мне следует использовать фильтр для удаления нулей.

a <- ndf %>%  group_by(BRAND, VARIANT)  %>% summarise_all(funs(n()))

Ответы [ 2 ]

3 голосов
/ 12 апреля 2019

Мы могли бы 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))
0 голосов
/ 12 апреля 2019

Мы можем сделать это с data.table, используя

library(data.table)
setDT(df)[, lapply(.SD, function(x) sum(x != 0)), .(BRAND, VARIANT)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...