【问题标题】:How to add totals as well as group_by statistics in R如何在 R 中添加总计和 group_by 统计信息
【发布时间】:2018-08-10 20:14:11
【问题描述】:

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

但我想要更紧凑的东西。特别是,我不想输入代码(汇总)两次,每组一次,总数一次。

【问题讨论】:

  • 我知道这是呈现一些信息的常用方法,但通常它是一种糟糕的存储信息的方法,因为第四行是第 1-3 行的“非常不同的野兽”。我只是想把这个警告放在那里......
  • 我相信你的代码只计算每个平均值一次;您的意思是您不想输入两次代码,每组一次,总数一次?
  • @DanY:同意,非常感谢你的机智和认识到不同的人和环境有不同的需求,这是一个很好的例子,说明如何在 SO 上保持友好。
  • 是的@Aaron。谢谢。将进行编辑以反映您的评论。
  • 标题用词不当,真的是“如何同时计算整个未分组数据集的汇总统计数据,并连接总数”

标签: r dplyr split-apply-combine


【解决方案1】:

如果你解开你想要做的事情,你可以简化它:你有 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

我喜欢上面 cmets 中的谨慎,尽管我必须做这种计算才能足够工作,以至于我在个人包中有类似的速记函数。对于标准偏差之类的东西,它可能不太有意义,但是我需要做很多事情来将人口统计组的总数等相加(如果有用,该函数是here)。

【讨论】:

  • 谢谢@camille!。迄今为止最好的答案。我得到的评论是这种计算需要低效地存储信息,但我仍然对没有标准函数来执行这种类型的分析感到惊讶。更难说服 Stata 用户切换。
【解决方案2】:

有点短,但与 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")
  )

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 2019-10-01
    • 2014-01-15
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多