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

如何在R中按分组统计列内多变量的出现频次

解决方案

先构造你的数据

首先把你提供的数据转换成R的数据框:

df <- data.frame(
  group = c("A", "B", "B", "C", "C", "C", "D", "D"),
  excellent = c("Yes", "No", "No", "No", "No", "Yes", "No", "Yes")
)

方法1:基础R实现

用table()生成交叉表后,调整结构就能得到你要的格式:

# 生成交叉统计表
cross_tab <- table(df$excellent, df$group)
# 转成数据框并调整列顺序
result <- as.data.frame.matrix(cross_tab)
# 添加Excellent列并调整列位置
result$Excellent <- rownames(result)
result <- result[, c("Excellent", colnames(result)[-ncol(result)])]
# 去掉行名
rownames(result) <- NULL

运行后得到的结果完全匹配你的需求:

ExcellentABCD
Yes1011
No0221

方法2:tidyverse工具链实现

如果你习惯用tidyverse的语法,用dplyr+tidyr可以更直观地完成:

library(dplyr)
library(tidyr)

result <- df %>%
  # 按excellent和group分组计数
  count(excellent, group) %>%
  # 把group列转成表头,空值填充0
  pivot_wider(names_from = group, values_from = n, values_fill = 0) %>%
  # 重命名列名匹配需求
  rename(Excellent = excellent)

为什么你之前的尝试没成功?

  • table()单独用会生成行是group、列是excellent的交叉表,你需要转置或者调整行列顺序才能得到目标格式;
  • tally()需要配合group_by(excellent, group)分组,再用pivot_wider把分组列转成表头,不然只会得到分组计数的长表;
  • as.data.frame()单独用只是转换数据结构,没有做交叉统计的逻辑,需要和统计函数配合使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:27:20