R基于palmer penguins按性别分组计算均值中位数极差分位数方法
R palmer penguins分组统计解决方案
问题说明
你遇到的两个问题核心原因如下:
aggregate公式接口丢失sex字段NA分组:aggregate的公式写法默认启用na.action = na.omit参数,会在计算前自动删除包含NA的观测行,因此sex为NA的分组不会出现在结果中。- 分开计算的两张表无法合并:分位数结果为长格式,需要先转换为宽格式再和汇总表关联,更推荐直接在单次分组统计中生成所有指标。
额外提示:你原有
group_summary代码中median拼写错误为meadian,运行会返回报错,修正拼写即可正常执行。
最优实现:dplyr一次性输出所有统计量
直接在单次summarize中计算所有指标,自动保留NA分组,输出宽格式汇总表:
# 加载所需包 library(tidyverse) library(palmerpenguins) # 一次性生成所有统计指标 full_summary <- penguins %>% # .drop = FALSE 强制保留sex字段的NA分组 group_by(sex, .drop = FALSE) %>% summarize( mean = mean(bill_length_mm, na.rm = TRUE), median = median(bill_length_mm, na.rm = TRUE), range = diff(range(bill_length_mm, na.rm = TRUE)), # 分位数结果暂存为list格式 quant = list(quantile(bill_length_mm, probs = seq(0.1, 1, by = 0.1), na.rm = TRUE)) ) %>% # 将分位数list拆分为单独的列,列名自动为10%、20%...100% unnest_wider(quant)
运行后full_summary每一行对应一个sex分组,列包含你需要的均值、中位数、极差、10%到100%分位数的所有指标。
原有aggregate代码修正方案
如果需要沿用aggregate写法,添加na.action = na.pass参数即可保留NA分组:
group_summary <- do.call(data.frame, aggregate( bill_length_mm ~ sex, penguins, function(x) c( mean = mean(x, na.rm = TRUE), median = median(x, na.rm = TRUE), range = diff(range(x, na.rm = TRUE)), quantile(x, probs = seq(.1, 1, by = .1), na.rm = TRUE) ), # 新增参数,不自动删除含NA的行 na.action = na.pass ) )
分开计算结果的合并方案
如果你需要保留原有分开计算的逻辑,将分位数长表转宽后关联即可:
library(tidyr) # 长格式分位数转宽格式 group_quant_wide <- group_quant %>% group_by(sex) %>% mutate(quant_name = paste0("q", seq(10, 100, 10))) %>% pivot_wider(names_from = quant_name, values_from = last_col()) # 关联两张表得到全量汇总结果 full_summary <- left_join(group_summary, group_quant_wide, by = "sex")
内容的提问来源于stack exchange,提问作者malkier11
相关产品推荐
相关产品推荐

