dplyr 过滤后跨组的行数

dplyr number of rows across groups after filtering

我想要数据框中每个组的计数和比例(所有元素的)(过滤后)。此代码产生所需的输出:

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()?])

我在文档中找不到这样的函数,但我一定遗漏了一些明显的东西。谢谢!

您可以在 . 上使用 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