使用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")
)
但是我想要更紧凑的东西。特别是,我不想键入两次代码(用于摘要),每个组一次,总计一次。
答案 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")
)