如何用dplyr创建多变量占比表?含R基础实现对比与占比需求
R语言多变量表格实现与占比添加方案
原始数据
A <- rep(c("A1", "A2", "A3"), 10) B <- sample(1:5, size=30, replace=TRUE) C <- sample(c("yes", "no"), size=30, replace=TRUE)
问题1:用tidyverse的dplyr结合group_by、summarize实现目标表格
要复刻基础Rdata.frame(rbind(table(B, A), table(C, A)))的输出效果,可按长格式转换→分组统计→宽格式重塑的流程实现:
library(tidyverse) # 整合数据并转成长格式,统一处理B、C变量 df <- tibble(A, B, C) %>% pivot_longer(cols = c(B, C), names_to = "variable", values_to = "value") # 分组计数后转宽格式,得到目标表格 result_table <- df %>% group_by(variable, value, A) %>% summarize(count = n(), .groups = "drop") %>% pivot_wider(names_from = A, values_from = count, values_fill = 0) print(result_table)
核心逻辑:
pivot_longer将B、C两个独立变量合并为variable(标记变量类型)和value(变量取值)两列,便于统一分组统计。group_by(variable, value, A)按变量类型、变量取值、A的类别分组,summarize(count = n())统计每组样本量。pivot_wider将A的类别(A1/A2/A3)转为列,values_fill = 0确保无数据的单元格填充0,和基础R的table输出逻辑一致。
问题2:为单元格添加占比
以下提供两种常见占比的实现方式,以行占比(对应variable-value行内的占比)为例:
result_table_with_row_pct <- df %>% group_by(variable, value, A) %>% summarize(count = n(), .groups = "drop") %>% group_by(variable, value) %>% mutate(pct = scales::percent(count / sum(count))) %>% # 格式化百分比,依赖scales包 mutate(cell = paste0(count, " (", pct, ")")) %>% # 合并计数与占比 select(-count, -pct) %>% pivot_wider(names_from = A, values_from = cell, values_fill = "0 (0%)") print(result_table_with_row_pct)
若需要列占比(对应A列内的占比),仅需调整分组逻辑:
result_table_with_col_pct <- df %>% group_by(variable, value, A) %>% summarize(count = n(), .groups = "drop") %>% group_by(variable, A) %>% mutate(pct = scales::percent(count / sum(count))) %>% mutate(cell = paste0(count, " (", pct, ")")) %>% select(-count, -pct) %>% pivot_wider(names_from = A, values_from = cell, values_fill = "0 (0%)") print(result_table_with_col_pct)
注:若不想依赖scales包,可手动格式化百分比:paste0(round(count / sum(count)*100, 1), "%")。
内容的提问来源于stack exchange,提问作者Produnis
相关产品推荐
相关产品推荐

