如何将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))
核心逻辑
- 用
enquos(...)捕获动态传入的分组变量,通过!!!展开传入count()实现动态分组计数 - 添加
row_id确保转宽操作时,每组的变量与类别值能精准对应 - 先转长格式拆分变量名和值,再按行ID分配序号,最后转回宽格式得到
variableN/categoryN的目标结构
内容的提问来源于stack exchange,提问作者pyg
相关产品推荐
相关产品推荐

