0

当使用计算任何统计数据时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")
  )

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

4

2 回答 2

1

如果你解开你想要做的事情,你可以简化它:你有iris几个物种的数据,你希望将这些数据与所有物种的数据一起汇总。您无需在绑定之前计算这些汇总统计信息。相反,绑定iris一个iris已设置为的版本Species = "Total",然后进行分组和汇总。

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

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

于 2018-08-10T23:57:52.997 回答
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")
  )
于 2018-08-10T22:37:17.260 回答