如何在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
运行后得到的结果完全匹配你的需求:
| Excellent | A | B | C | D |
|---|---|---|---|---|
| Yes | 1 | 0 | 1 | 1 |
| No | 0 | 2 | 2 | 1 |
方法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
相关产品推荐
相关产品推荐

