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

如何批量统计tibble中STYL类变量的分组计数并写入Excel?

问题根源

你的原代码无法运行,是因为group_by(tempo_variable)里的tempo_variable是字符串,dplyr会把它当成一个新的变量名,而不是引用tested_data里对应的列。我们需要把字符串转换成dplyr能识别的变量引用。

下面提供两种解决方案:修正后的for循环版本,以及更符合tidyverse风格的无循环方案,同时包含写入Excel的完整流程。


方案1:修正for循环版本

这个方案保留你熟悉的循环逻辑,同时解决变量解析问题,还能自动识别所有以STYL开头的变量(不用手动维护列表):

library(tibble)
library(dplyr)
library(openxlsx)

# 示例数据
tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3))

# 自动获取所有以STYL开头的变量名(无需手动写列表)
styl_vars <- grep("^STYL", colnames(tested_data), value = TRUE)

# 创建Excel工作簿和工作表
wb <- createWorkbook()
addWorksheet(wb, sheetName = "STYL频数统计")

# 控制写入的起始行
start_row <- 1

for (tempo_var in styl_vars) {
  # 正确引用字符串变量:用.data[[tempo_var]]或!!sym(tempo_var)
  dt <- tested_data %>%
    group_by(.data[[tempo_var]]) %>%  # .data是tidyverse推荐的字符串变量引用方式
    count(name = "频数") %>%  # 给计数列起个直观的名字
    ungroup() %>%
    rename(!!tempo_var := `.data[[tempo_var]]`)  # 把列名改回原变量名
  
  # 写入Excel:先写变量名作为标题,再写统计结果
  writeData(wb, sheet = "STYL频数统计", x = tempo_var, startRow = start_row, startCol = 1)
  start_row <- start_row + 1
  writeData(wb, sheet = "STYL频数统计", x = dt, startRow = start_row, startCol = 1)
  # 写完后空一行,提升可读性
  start_row <- start_row + nrow(dt) + 1
}

# 保存工作簿
saveWorkbook(wb, "STYL变量频数统计.xlsx", overwrite = TRUE)

方案2:无循环的tidyverse风格方案

如果不想用循环,可以用tidyr转长格式后一次性统计,或者用purrr批量处理,下面是两种更简洁的实现:

方式A:转长格式后统一统计

这种方式最简洁,适合需要把所有结果合并成一张表的场景:

library(tibble)
library(dplyr)
library(tidyr)
library(openxlsx)

tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3))

# 把宽格式转成长格式,然后分组统计所有变量的频数
all_freq <- tested_data %>%
  pivot_longer(
    cols = starts_with("STYL"),
    names_to = "变量名",
    values_to = "取值"
  ) %>%
  group_by(变量名, 取值) %>%
  count(name = "频数") %>%
  ungroup()

# 写入Excel
wb <- createWorkbook()
addWorksheet(wb, sheetName = "合并频数统计")
writeData(wb, sheet = "合并频数统计", x = all_freq)
saveWorkbook(wb, "STYL合并频数统计.xlsx", overwrite = TRUE)

方式B:用purrr批量处理(保留分块写入格式)

如果需要和循环一样分块写入Excel(每个变量结果单独成块),可以用purrr::walk执行写入操作:

library(tibble)
library(dplyr)
library(purrr)
library(openxlsx)

tested_data <- tibble(STYL1 = c(1,2,3,1,2), STYL2 = c(2,2,3,1,4), STYL3 = c(4,2,4,1,3))
styl_vars <- grep("^STYL", colnames(tested_data), value = TRUE)

wb <- createWorkbook()
addWorksheet(wb, sheetName = "分块频数统计")
start_row <- 1

# 用walk遍历变量,执行写入操作
walk(styl_vars, function(var) {
  dt <- tested_data %>%
    group_by(.data[[var]]) %>%
    count(name = "频数") %>%
    ungroup() %>%
    rename(!!var := `.data[[var]]`)
  
  writeData(wb, sheet = "分块频数统计", x = var, startRow = start_row, startCol = 1)
  start_row <<- start_row + 1  # 用<<-修改外部环境的起始行变量
  writeData(wb, sheet = "分块频数统计", x = dt, startRow = start_row, startCol = 1)
  start_row <<- start_row + nrow(dt) + 1
})

saveWorkbook(wb, "STYL分块频数统计.xlsx", overwrite = TRUE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:27:56