如何在dplyr中结合summarize与summarise_if实现分组聚合
合并分组计数与数值变量汇总的dplyr实现
你可以在同一个summarise()调用中同时完成分组计数和数值变量的汇总,不需要拆分两步。这里推荐使用dplyr的across()函数(替代已软弃用的summarise_if()),代码如下:
library(dplyr) # 加载数据集 data("iris") # 一步完成分组计数+数值变量汇总 iris_summary <- iris %>% group_by(Species) %>% summarise( 观测数 = n(), # 统计每组的观测数量,列名可自定义 # 对所有数值型变量计算均值,可替换为sum、median、max等函数 across(where(is.numeric), mean, .names = "均值_{.col}") ) print(iris_summary)
代码说明
group_by(Species):按Species列分组n():直接生成每组的观测计数across(where(is.numeric), ...):自动识别所有数值型变量,对其应用指定的汇总函数(这里用mean做示例),.names参数可以自定义汇总后的列名格式,让结果更清晰
如果你仍想使用旧版的summarise_if(),可以这么写:
iris_summary <- iris %>% group_by(Species) %>% summarise( 观测数 = n(), # 调用summarise_if并移除重复的Species列 !!!summarise_if(., is.numeric, mean) %>% select(-Species) )
为什么分步执行会出错
如果先单独执行summarise(n = n()),此时分组后的数据集仅保留Species和计数列,原有的数值变量已经被丢弃,后续的summarise_if()找不到需要汇总的数值变量,因此会出现错误。必须在同一个summarise()步骤中同时完成两项操作,才能保留所有需要处理的变量。
内容的提问来源于stack exchange,提问作者Olympia
相关产品推荐
相关产品推荐

