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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:45:49