编写循环/函数计算健康类指标按分组的占比(分区域,禁用pivot_longer)
批量计算多指标多维度分组占比(分区域输出)
需求说明
针对给定的调查数据集,需完成以下操作:
- 对
overall_health、outlook_life、health_mental三个健康相关指标,分别按sex、age_group、income、education四个维度分组计算占比 - 按
geography字段的area1和area2生成独立的计算结果输出 - 禁止使用
pivot_longer函数
示例数据集
library(tidyverse) library(dplyr) df <- data.frame (overall_health = c("poor", "good", "excellent", "poor", "good", "poor", "poor", "excellent"), outlook_life = c("good", "excellent", "excellent", "poor", "excellent", "poor", "excellent", "poor"), health_mental = c("poor", "poor", "excellent", "poor", "poor", "poor", "excellent", "good"), sex = c("F", "M", "M", "F", "F", "M", "F", "M"), age_group = c("50-54", "60-64", "80+", "70-74", "40-44", "45-49", "60-64", "65-69"), income = c("$<40,000", "$50,000-79,000", "$80,000-110,000", "$111,000+", "$<40,000", "$<40,000", "$50,000-79,000", "$80,000-110,000"), education = c("HS", "College", "Bachelors", "Masters", "HS", "College", "Bachelors", "Masters"), geography= c("area1", "area2", "area1", "area2", "area2", "area1", "area2", "area1"))
实现方案
通过自定义函数结合循环批量处理所有指标与分组维度的组合,同时拆分区域输出。
1. 定义占比计算函数
该函数接收目标指标列名、分组维度列名及数据集,返回按指定维度+区域分组后的占比结果:
calc_proportion <- function(target_col, group_col, data) { data %>% group_by(!!sym(target_col), !!sym(group_col), geography) %>% summarise(count = n(), .groups = "drop") %>% group_by(!!sym(group_col), geography) %>% mutate(total = sum(count), proportion = round(count / total * 100, 2)) %>% ungroup() %>% select(geography, !!sym(group_col), !!sym(target_col), count, total, proportion) }
注:使用
!!sym()处理字符串列名,实现动态参数传递;占比分母采用分组维度下的区域总样本数,更贴合实际统计逻辑(替代原示例中固定全局总数的方式)
2. 定义待处理的指标与维度列表
target_cols <- c("overall_health", "outlook_life", "health_mental") group_cols <- c("sex", "age_group", "income", "education")
3. 循环处理所有组合并拆分区域结果
将所有结果存储于列表,同时按区域拆分:
all_results <- list() for (target in target_cols) { for (group in group_cols) { # 计算当前组合的占比 combined_result <- calc_proportion(target, group, df) # 拆分区域结果 area1_result <- combined_result %>% filter(geography == "area1") area2_result <- combined_result %>% filter(geography == "area2") # 存入列表,命名规则:指标_维度_区域 all_results[[paste(target, group, "area1", sep = "_")]] <- area1_result all_results[[paste(target, group, "area2", sep = "_")]] <- area2_result } }
4. 查看或导出结果
- 查看指定结果:直接通过列表名称调用,例如查看
overall_health按age_group分组的area1结果:
all_results$overall_health_age_group_area1
- 导出为CSV文件:循环导出所有区域结果到本地
for (result_name in names(all_results)) { write.csv(all_results[[result_name]], paste0(result_name, ".csv"), row.names = FALSE) }
内容的提问来源于stack exchange,提问作者R_coder_new
相关产品推荐
相关产品推荐

