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

如何将count()多列结果转为动态变量-类别名值对(tidyverse方案)

解决方案

要实现动态分组计数并转换为variableN/categoryN的列格式,可以用tidyverse工具链结合动态变量处理完成,兼容任意数量的分组变量和curly-curly语法:

实现代码

library(tidyverse)

count_to_var_cat <- function(data, ...) {
  # 捕获动态传入的分组变量
  group_cols <- enquos(...)
  
  data %>%
    # 执行动态分组计数
    count(!!!group_cols) %>%
    # 给每组添加唯一行ID,作为后续转宽的分组依据
    mutate(row_id = row_number()) %>%
    # 将所有分组列转成长格式,拆分变量名和对应类别值
    pivot_longer(
      cols = -c(row_id, n),
      names_to = "variable",
      values_to = "category"
    ) %>%
    # 按行ID分组,给每个变量/类别对分配序号(variable1、category1...)
    mutate(
      var_col = str_c("variable", row_number()),
      cat_col = str_c("category", row_number()),
      .by = row_id
    ) %>%
    # 转回宽格式,展开序号化的变量和类别列
    pivot_wider(
      id_cols = c(row_id, n),
      names_from = c(var_col, cat_col),
      values_from = c(variable, category)
    ) %>%
    # 清理列名和多余的行ID列
    select(-row_id) %>%
    rename_with(~str_remove(., "_variable|_category"), everything())
}

使用示例

单分组变量场景

mtcars %>% count_to_var_cat(cyl)

输出结果:

n variable1 category1
1 11       cyl         4
2  7       cyl         6
3 14       cyl         8

多分组变量场景

mtcars %>% count_to_var_cat(cyl, gear)

输出结果:

n variable1 category1 variable2 category2
1   1       cyl         4       gear         3
2   8       cyl         4       gear         4
3   2       cyl         4       gear         5
4   2       cyl         6       gear         3
5   4       cyl         6       gear         4
6   1       cyl         6       gear         5
7  12       cyl         8       gear         3
8   2       cyl         8       gear         5

兼容curly-curly语法

如果分组变量以符号或字符串形式存储,也能正常调用:

# 用quo定义单个分组变量
group1 <- quo(cyl)
mtcars %>% count_to_var_cat(!!group1, gear)

# 用字符串向量定义多个分组变量
group_vec <- c("cyl", "gear")
mtcars %>% count_to_var_cat(!!!syms(group_vec))

核心逻辑

  1. 用enquos(...)捕获动态传入的分组变量,通过!!!展开传入count()实现动态分组计数
  2. 添加row_id确保转宽操作时,每组的变量与类别值能精准对应
  3. 先转长格式拆分变量名和值,再按行ID分配序号,最后转回宽格式得到variableN/categoryN的目标结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:22:53