如何用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
相关产品推荐
相关产品推荐

