dplyr количество строк в группах после фильтрации

Мне нужно количество и пропорции (всех элементов) каждой группы в кадре данных (после фильтрации). Этот код дает желаемый результат:

library(dplyr)
df <- data_frame(id = sample(letters[1:3], 100, replace = TRUE),
                 value = rnorm(100))

summary <- filter(df, value > 0) %>%
    group_by(id) %>%
    summarize(count = n()) %>%
    ungroup() %>%
    mutate(proportion = count / sum(count))

> summary
# A tibble: 3 x 3
     id count proportion
  <chr> <int>      <dbl>
1     a    17  0.3695652
2     b    13  0.2826087
3     c    16  0.3478261

Есть ли элегантное решение, позволяющее избежать ungroup() и вторых summarize() шагов. Что-то вроде:

summary <- filter(df, value > 0) %>%
    group_by(id) %>%
    summarize(count = n(),
              proportion = n() / [?TOTAL_ROWS()?])

Мне не удалось найти такую ​​функцию в документации, но мне, должно быть, не хватает чего-то очевидного. Спасибо!


person Fridolin Linder    schedule 27.11.2017    source источник


Ответы (1)


Вы можете использовать nrow на ., который относится ко всему фрейму данных, передаваемому по конвейеру:

df %>% 
    filter(value > 0) %>% 
    group_by(id) %>% 
    summarise(count = n(), proportion = count / nrow(.))

# A tibble: 3 x 3
#     id count proportion
#  <chr> <int>      <dbl>
#1     a    14  0.2592593
#2     b    22  0.4074074
#3     c    18  0.3333333
person Psidom    schedule 27.11.2017