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

如何用R的dplyr包按月份分组并汇总数值与分类变量

按月份分组汇总数据框的数值与分类变量

需求:按月份分组,对数据框中的所有变量进行汇总:

  • 数值变量:计算中位数、5%分位数、95%分位数
  • 分类变量:展示每月出现频率最高的水平,以及该水平的百分比占比

示例数据集:

date <- as.Date(c("2021-03-13", 
                  "2021-03-12", 
                  "2021-04-14", 
                  "2021-04-17", 
                  "2021-04-17", 
                  "2021-05-17", "2021-05-17", "2021-06-17", "2021-07-17", "2021-07-17"))
Partograph_use <- as.factor(c("Partograph", "Partograph","Partograph",
                              "Partograph","Partograph", "Partograph","labor care guide" ,
                              "labor care guide", "labor care guide" , "labor care guide"))
duration_labor <- as.numeric(c(12, 5, 6, 5, 5, 6, 7, 10, 10, 5))
augument_ox <- as.factor(c("Yes", "Yes", "No", "No", "No", "No", "Yes", "No", "Yes", "No"))
urgent_csection <- as.factor(c("Yes", "Yes", "No", "No", "No", "No", "Yes", "No", "Yes", "No"))

test.df <- cbind.data.frame(date, Partograph_use, duration_labor, augument_ox, urgent_csection)

用户已实现数值变量部分的汇总,但无法处理分类变量的频率最高水平及占比统计。


解决方案

结合dplyr和lubridate,自定义函数处理分类变量的众数及占比,统一完成分组汇总。

1. 加载所需包

library(dplyr)
library(lubridate)

2. 自定义分类变量汇总函数

该函数返回分组内频率最高的类别及对应占比:

get_mode_info <- function(x) {
  # 计算各水平频率
  freq_table <- table(x)
  # 提取最高频率及对应水平
  max_freq <- max(freq_table)
  mode_level <- names(freq_table)[freq_table == max_freq]
  # 计算占比(保留两位小数)
  mode_pct <- round(max_freq / length(x) * 100, 2)
  # 若存在多个众数,取第一个(可按需修改为拼接所有众数)
  data.frame(mode_level = mode_level[1], mode_pct = mode_pct, stringsAsFactors = FALSE)
}

3. 完整分组汇总代码

test.df %>%
  # 按月份分组
  group_by(month = floor_date(date, "month")) %>%
  summarize(
    # 数值变量汇总:duration_labor的中位数、5%/95%分位数
    median_dur_labor = median(duration_labor, na.rm = TRUE),
    q5_dur_labor = quantile(duration_labor, probs = 0.05, na.rm = TRUE),
    q95_dur_labor = quantile(duration_labor, probs = 0.95, na.rm = TRUE),
    # 批量处理分类变量的众数及占比
    across(c(Partograph_use, augument_ox, urgent_csection), get_mode_info, .names = "{col}_{.fn}")
  ) %>%
  # 整理列名,提升可读性
  rename(
    Partograph_use_mode = Partograph_use_mode_level,
    Partograph_use_pct = Partograph_use_mode_pct,
    augument_ox_mode = augument_ox_mode_level,
    augument_ox_pct = augument_ox_mode_pct,
    urgent_csection_mode = urgent_csection_mode_level,
    urgent_csection_pct = urgent_csection_mode_pct
  )

结果说明

运行代码后将得到按月份分组的汇总表:

  • 包含数值变量duration_labor的中位数、5%分位数、95%分位数
  • 每个分类变量的众数(频率最高的水平)及该水平的百分比占比

扩展说明

若分组内存在多个频率相同的众数,可修改get_mode_info函数,将mode_level[1]改为paste(mode_level, collapse = ", "),即可展示所有众数。


内容的提问来源于stack exchange,提问作者Anthony Kayiira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:25:35