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

时间:2018-08-10 20:14:11

标签: r dplyr totals split-apply-combine

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

但是我想要更紧凑的东西。特别是,我不想键入两次代码(用于摘要),每个组一次,总计一次。

2 个答案:

答案 0 :(得分:1)

如果您解开要尝试的操作,则可以简化它:您拥有iris个数据,该数据包含多个种类,并且希望将其连同所有种类的数据一起汇总。您不需要在绑定前 计算这些摘要统计信息。而是将iris与已设置为iris的{​​{1}}版本绑定,然后进行分组和汇总。

Species = "Total"

我喜欢上面的评论中的警告,尽管我必须进行这种计算才能工作,以至于我在个人包装中也具有类似的速记功能。对于诸如标准偏差之类的事情来说,这可能没什么意义,但是我需要做很多事来增加人口统计总数等。(如果有用,该函数为here)。

答案 1 :(得分:0)

短一点,尽管与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")
  )