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

编写循环/函数计算健康类指标按分组的占比(分区域,禁用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:15:33