如何在 R 中添加总计以及 group_by 统计信息

How to add totals as well as group_by statistics in R

当使用 summarisegroup_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)。