如何在 R 中添加总计以及 group_by 统计信息
How to add totals as well as group_by statistics in R
当使用 summarise
和 group_by
计算任何统计数据时,我们只会得到每个类别的汇总统计数据,而不是所有人口的值(总计)。如何同时获得?
我正在寻找干净而简短的东西。到现在我只能想到:
bind_rows(
iris %>% group_by(Species) %>% summarise(
"Mean" = mean(Sepal.Width),
"Median" = median(Sepal.Width),
"sd" = sd(Sepal.Width),
"p10" = quantile(Sepal.Width, probs = 0.1))
,
iris %>% summarise(
"Mean" = mean(Sepal.Width),
"Median" = median(Sepal.Width),
"sd" = sd(Sepal.Width),
"p10" = quantile(Sepal.Width, probs = 0.1)) %>%
mutate(Species = "Total")
)
但我想要更紧凑的东西。特别是,我不想输入代码(用于总结)两次,一次针对每个组,一次针对总数。
有点短,但与 bind_rows
非常相似
q10 <- function(x){quantile(x , probs=0.1)}
iris %>%
select(Species,Sepal.Width)%>%
group_by(Species) %>%
summarise_all(c("mean", "sd", "q10")) %>%
t() %>%
cbind(c("total", iris %>% select(Sepal.Width) %>% summarise_all(c("mean", "sd", "q10")))) %>%
t()
可能更干净:
bind_rows(
iris %>%
group_by(Species) %>%
select(Sepal.Width)%>%
summarise_all(c("mean", "sd", "q10"))
,
iris %>%
select(Sepal.Width)%>%
summarise_all(c("mean", "sd", "q10")) %>%
mutate(Species = "Total")
)
如果您理清您要尝试做的事情,您可以简化它:您有 iris
包含多个物种的数据,并且您希望将这些数据与所有物种的数据一起汇总。您无需在可以绑定之前 计算那些摘要统计数据。相反,将 iris
与已设置为 Species = "Total"
的 iris
版本绑定,然后分组并汇总。
library(tidyverse)
bind_rows(
iris,
iris %>% mutate(Species = "Total")
) %>%
group_by(Species) %>%
summarise(Mean = mean(Sepal.Width),
Median = median(Sepal.Width),
sd = sd(Sepal.Width),
p10 = quantile(Sepal.Width, probs = 0.1))
#> # A tibble: 4 x 5
#> Species Mean Median sd p10
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 setosa 3.43 3.4 0.379 3
#> 2 Total 3.06 3 0.436 2.5
#> 3 versicolor 2.77 2.8 0.314 2.3
#> 4 virginica 2.97 3 0.322 2.59
我喜欢上面评论中的警告,尽管我必须为工作做足够多的这种计算,以至于我在个人包中有一个类似的 shorthand 函数。对于标准偏差之类的事情,它可能意义不大,但这是我需要做很多事情才能将人口统计群体的总数相加等。(如果有用,该函数是 here)。
当使用 summarise
和 group_by
计算任何统计数据时,我们只会得到每个类别的汇总统计数据,而不是所有人口的值(总计)。如何同时获得?
我正在寻找干净而简短的东西。到现在我只能想到:
bind_rows(
iris %>% group_by(Species) %>% summarise(
"Mean" = mean(Sepal.Width),
"Median" = median(Sepal.Width),
"sd" = sd(Sepal.Width),
"p10" = quantile(Sepal.Width, probs = 0.1))
,
iris %>% summarise(
"Mean" = mean(Sepal.Width),
"Median" = median(Sepal.Width),
"sd" = sd(Sepal.Width),
"p10" = quantile(Sepal.Width, probs = 0.1)) %>%
mutate(Species = "Total")
)
但我想要更紧凑的东西。特别是,我不想输入代码(用于总结)两次,一次针对每个组,一次针对总数。
有点短,但与 bind_rows
非常相似 q10 <- function(x){quantile(x , probs=0.1)}
iris %>%
select(Species,Sepal.Width)%>%
group_by(Species) %>%
summarise_all(c("mean", "sd", "q10")) %>%
t() %>%
cbind(c("total", iris %>% select(Sepal.Width) %>% summarise_all(c("mean", "sd", "q10")))) %>%
t()
可能更干净:
bind_rows(
iris %>%
group_by(Species) %>%
select(Sepal.Width)%>%
summarise_all(c("mean", "sd", "q10"))
,
iris %>%
select(Sepal.Width)%>%
summarise_all(c("mean", "sd", "q10")) %>%
mutate(Species = "Total")
)
如果您理清您要尝试做的事情,您可以简化它:您有 iris
包含多个物种的数据,并且您希望将这些数据与所有物种的数据一起汇总。您无需在可以绑定之前 计算那些摘要统计数据。相反,将 iris
与已设置为 Species = "Total"
的 iris
版本绑定,然后分组并汇总。
library(tidyverse)
bind_rows(
iris,
iris %>% mutate(Species = "Total")
) %>%
group_by(Species) %>%
summarise(Mean = mean(Sepal.Width),
Median = median(Sepal.Width),
sd = sd(Sepal.Width),
p10 = quantile(Sepal.Width, probs = 0.1))
#> # A tibble: 4 x 5
#> Species Mean Median sd p10
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 setosa 3.43 3.4 0.379 3
#> 2 Total 3.06 3 0.436 2.5
#> 3 versicolor 2.77 2.8 0.314 2.3
#> 4 virginica 2.97 3 0.322 2.59
我喜欢上面评论中的警告,尽管我必须为工作做足够多的这种计算,以至于我在个人包中有一个类似的 shorthand 函数。对于标准偏差之类的事情,它可能意义不大,但这是我需要做很多事情才能将人口统计群体的总数相加等。(如果有用,该函数是 here)。