如何按组进行汇总并使用R中的dplyr获取总体数据集的摘要
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何按组进行汇总并使用R中的dplyr获取总体数据集的摘要相关的知识,希望对你有一定的参考价值。
[我想计算不同组的摘要,并同时为整个(未分组的)数据集计算摘要,最好使用dplyr(或非常适合dplyr管道的东西)。
期望的结果可以通过分别计算组摘要,然后是总体摘要,然后合并结果来实现。但是,这似乎效率不高,我希望有一个更简单的解决方案,它需要更少的代码重复。我在文档中或其他问题中都没有找到与此相关的任何内容。
可复制数据:
library(tidyverse)
set.seed(500)
dat <-
data_frame(treatment = sample(c("Group1", "Group2", "Group3"), 100, replace = TRUE),
recruitment_strategy = sample(c("Strategy 1", "Strategy 2", "Strategy 3", "Strategy 4", "Strategy 5"), 100, replace = TRUE),
Variable_A = rnorm(100),
Variable_B = rnorm(100),
Variable_C = rnorm(100))
用于按组和整体数据集中的均值计算多个变量均值的代码:
count_by_group <- dat %>%
group_by(treatment) %>%
count(recruitment_strategy) %>%
mutate(`n (%)` = paste0(n, " (", round(n / sum(n)*100,0), "%)")) %>%
select(-n) %>%
spread(treatment, `n (%)`)
count_overall <- dat %>%
count(recruitment_strategy) %>%
mutate(`n (%)` = paste0(n, " (", round(n / sum(n)*100,0), "%)")) %>%
select(-n) %>%
rename(Overall_dataset = `n (%)`)
left_join(count_by_group, count_overall)
通过上面的代码获得所需的输出:每个组的均值表,紧随整体均值之后:
variable Group1 Group2 Group3 Overall_dataset
<chr> <dbl> <dbl> <dbl> <dbl>
1 Variable_A -0.154 0.0385 0.263 0.0351
2 Variable_B 0.212 -0.232 -0.124 -0.0671
3 Variable_C -0.195 0.194 0.0508 0.0376
对分类变量进行类似的处理,以获取每个组以及整个数据集的计数和百分比:
count_by_group <- dat %>%
group_by(treatment) %>%
count(recruitment_strategy) %>%
mutate(`n (%)` = paste0(n, " (", round(n / sum(n)*100,0), "%)")) %>% # calculate percentage in the desired format for table
select(-n) %>%
spread(treatment, `n (%)`)
count_overall <- dat %>%
count(recruitment_strategy) %>%
mutate(`n (%)` = paste0(n, " (", round(n / sum(n)*100,0), "%)")) %>% # calculate percentage in the desired format for table
select(-n) %>%
rename(Overall_dataset = `n (%)`)
left_join(count_by_group, count_overall)
recruitment_strategy Group1 Group2 Group3 Overall_dataset
<chr> <chr> <chr> <chr> <chr>
1 Strategy 1 2 (6%) 13 (30%) 4 (16%) 19 (19%)
2 Strategy 2 8 (26%) 6 (14%) 6 (24%) 20 (20%)
3 Strategy 3 6 (19%) 12 (27%) 3 (12%) 21 (21%)
4 Strategy 4 9 (29%) 4 (9%) 5 (20%) 18 (18%)
5 Strategy 5 6 (19%) 9 (20%) 7 (28%) 22 (22%)
是否有一种解决方案可以在一个步骤中获得分组摘要和整体摘要,而不需要分配两个单独的对象,然后将它们合并为第三个对象?
这是我将如何重写您的代码。
使用管道的技巧是使用.
将LHS放在RHS的多个位置。这样,您就可以进行联接而无需分配中间对象。我还使用了一些其他步骤来达到不同的清晰度平衡,而不是重复我自己,例如在count()
中进行所有分组并使用其name
参数,在联接后使用mutate_at
进行所有格式化,以及使用str_glue
和scales::percent
使字符串格式更具可读性。
所有这些都在某种程度上是一个优先事项,但是我认为通过以下方法可以避免中间分配(以及必须为上述对象命名的负担)。
library(tidyverse)
set.seed(500)
dat <- tibble(
treatment = sample(c("Group1", "Group2", "Group3"), 100, replace = TRUE),
recruitment_strategy = sample(c("Strategy 1", "Strategy 2", "Strategy 3", "Strategy 4", "Strategy 5"), 100, replace = TRUE),
Variable_A = rnorm(100),
Variable_B = rnorm(100),
Variable_C = rnorm(100)
)
dat %>%
inner_join(
x = count(., treatment, recruitment_strategy) %>% spread(treatment, n),
y = count(., recruitment_strategy, name = "Overall_dataset"),
by = "recruitment_strategy"
) %>%
mutate_at(
.vars = vars(-recruitment_strategy),
.funs = ~ str_glue(". (scales::percent(. / sum(.), accuracy = 1))")
)
#> # A tibble: 5 x 5
#> recruitment_strategy Group1 Group2 Group3 Overall_dataset
#> <chr> <glue> <glue> <glue> <glue>
#> 1 Strategy 1 2 (6%) 13 (30%) 4 (16%) 19 (19%)
#> 2 Strategy 2 8 (26%) 6 (14%) 6 (24%) 20 (20%)
#> 3 Strategy 3 6 (19%) 12 (27%) 3 (12%) 21 (21%)
#> 4 Strategy 4 9 (29%) 4 (9%) 5 (20%) 18 (18%)
#> 5 Strategy 5 6 (19%) 9 (20%) 7 (28%) 22 (22%)
由reprex package(v0.3.0)在2019-11-10创建
以上是关于如何按组进行汇总并使用R中的dplyr获取总体数据集的摘要的主要内容,如果未能解决你的问题,请参考以下文章
R(和 dplyr?) - 按组从数据帧中采样,最大样本大小为 n
R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和使用tapply函数按组聚合求和按组聚合求和(使用dplyr包)