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

如何用for循环或purrr包简化R中多问卷题的重复统计导出工作

批量生成多选题频率表并导出Excel

假设你的数据集名为survey_data,多选题列名为q1至q10,分组变量为age和region,且多选题选项以逗号分隔(如"选项A,选项B")。以下提供for循环和purrr批量处理两种方案,复用单题处理逻辑:

前置准备:加载依赖包与定义通用处理函数

首先加载所需工具包,并封装单题的三类频率表生成逻辑为函数,避免重复代码:

library(tidyverse)
library(openxlsx)

# 定义生成单题三类频率表的函数
generate_freq_tables <- function(question_col, data) {
  # 1. 总体频率表
  overall_freq <- data %>%
    separate_rows({{ question_col }}, sep = ",") %>%
    mutate({{ question_col }} := trimws({{ question_col }})) %>%
    count({{ question_col }}, name = "count") %>%
    mutate(percentage = round(count / sum(count) * 100, 2),
           group = "总体") %>%
    select(group, {{ question_col }}, count, percentage)
  
  # 2. 按age分组频率表
  age_grouped_freq <- data %>%
    separate_rows({{ question_col }}, sep = ",") %>%
    mutate({{ question_col }} := trimws({{ question_col }})) %>%
    count(age, {{ question_col }}, name = "count") %>%
    group_by(age) %>%
    mutate(percentage = round(count / sum(count) * 100, 2),
           group = paste0("按age分组_", age)) %>%
    ungroup() %>%
    select(group, {{ question_col }}, count, percentage)
  
  # 3. 按region分组频率表
  region_grouped_freq <- data %>%
    separate_rows({{ question_col }}, sep = ",") %>%
    mutate({{ question_col }} := trimws({{ question_col }})) %>%
    count(region, {{ question_col }}, name = "count") %>%
    group_by(region) %>%
    mutate(percentage = round(count / sum(count) * 100, 2),
           group = paste0("按region分组_", region)) %>%
    ungroup() %>%
    select(group, {{ question_col }}, count, percentage)
  
  # 合并三类表并返回
  bind_rows(overall_freq, age_grouped_freq, region_grouped_freq)
}

方案1:使用for循环批量处理

创建Excel工作簿,遍历所有多选题列,生成频率表后写入对应工作表:

# 定义所有多选题列名
question_cols <- paste0("q", 1:10)

# 创建空的Excel工作簿
wb <- createWorkbook()

# 循环处理每道题
for (q_col in question_cols) {
  # 生成当前题的频率表
  freq_table <- generate_freq_tables(!!sym(q_col), survey_data)
  # 添加工作表,命名为题目列名
  addWorksheet(wb, sheetName = q_col)
  # 将频率表写入工作表
  writeData(wb, sheet = q_col, x = freq_table)
}

# 保存Excel文件
saveWorkbook(wb, file = "多选题频率表汇总.xlsx", overwrite = TRUE)

方案2:使用purrr包批量处理

利用purrr::walk遍历题目列,无需返回结果,直接完成写入操作:

# 创建空工作簿
wb <- createWorkbook()

# 用walk遍历每道题,写入Excel
walk(question_cols, function(q_col) {
  freq_table <- generate_freq_tables(!!sym(q_col), survey_data)
  addWorksheet(wb, sheetName = q_col)
  writeData(wb, sheet = q_col, x = freq_table)
})

# 保存文件
saveWorkbook(wb, file = "多选题频率表汇总_purrr版.xlsx", overwrite = TRUE)

说明

  • 若你的多选题存储格式不是逗号分隔(如多列二进制编码),只需修改generate_freq_tables函数中的拆分逻辑即可。
  • 可根据需求调整频率表的格式(如百分比小数位数、列顺序),或在写入Excel时添加样式(使用openxlsx的addStyle函数)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:22:14