You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:27:00