首页 > > > 【R语言】tidyverse之七:分组汇总
分组汇总,相当于 Excel 的透视表功能。
对未分组的数据框,一些操作如 mutate() 是在所有行上执行——或者说,整个数据框是一个分组,所有行都属于它。
若数据框被分组,则这些操作是分别在每个分组上独立执行。可以认为是,将数据框拆分为更小的多个数据框。在每个更小的数据框上执行操作,最后再将结果合并回来。
用 group_by() 函数创建分组,用 groups() 查看数据框的分组,用 ungroup() 解除分组。
dat <- warpbreaks %>%
group_by(wool, tension)
dat %>%
groups() 
dat %>%
ungroup() %>%
groups()
对数据框做分组最主要的目的就是做分组汇总,汇总就是以某种方式组合行,用 dplyr 包中的summarise() 实现,结果只保留分组列和新创建的列。
(1)summarise()
summarise() 可以与很多自带或自定义的汇总函数连用,常用的汇总函数有:
n() - 观测数;n_distinct(var) - 变量 var 的唯一值数目;sum(var), max(var), min(var), …mean(var), median(var), sd(var), IQR(var), …iris %>%
group_by(Species) %>%
summarise(n = n(),
avg_len = mean(Petal.Length, na.rm=TRUE),
med_len = median(Petal.Length))
函数 summarise() 也有一些作用域的变种:
使用它们的好处是,可以借助辅助选择器或判断条件选择多列,还能在这些列上执行多个函数,只需要将它们放入一个列表。
(2)summarise_if()
dat <- iris %>%
group_by(Species) %>%
summarise_if(is.numeric, list(~mean(.), ~median(.), ~min(.), ~max(.)))这样得到的 dat 是一个 3 行 17 列的宽表(部分):

重塑为更具可读性的长表:
dat %>%
pivot_longer(-Species,
names_to = c("Vars", ".value"),
names_sep = "_") 
(3)summarise_all()
iris %>%
group_by(Species) %>%
summarise_all(mean, na.rm=TRUE)
(4)summarise_at()
iris %>%
group_by(Species) %>%
summarise_at(vars(ends_with("Length")), mean)
按分类变量 order 和 vore 分组,并按分组大小排序:
msleep %>%
count(order, vore, sort = TRUE)
用 add_count(...) 可为数据集增加一列按 ... 分组的计数:
msleep %>%
select(name:vore) %>%
add_count(vore)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3162095/ ,如需转载,请注明出处,否则将追究法律责任。