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