R语言自动生成频率表:优化手动统计代码
解决方案
方法1:使用基础R的table()函数(最简单高效)
这是生成交叉频率表最直接的方式,一行代码就能搞定,完全无需手动拆分合并数据框:
# 构造示例数据 df <- data.frame( Type = c("A", "B", "A", "C", "B", "C", "A"), District = c(1, 1, 2, 1, 1, 2, 2) ) # 生成交叉频率表 freq_table <- table(df$Type, df$District) # 转为数据框格式(按需选择) as.data.frame.matrix(freq_table)
输出结果:
| 1 | 2 | |
|---|---|---|
| A | 1 | 2 |
| B | 2 | 0 |
| C | 1 | 1 |
方法2:使用sapply实现自动化
如果需要用sapply实现,可通过遍历所有District,自动统计各Type的出现次数,适配任意数量的分类:
# 获取唯一的Type和District unique_types <- unique(df$Type) unique_districts <- unique(df$District) # 用sapply嵌套遍历统计频率 freq_table_sapply <- sapply(unique_districts, function(d) { sapply(unique_types, function(t) { sum(df$Type == t & df$District == d) }) }) # 设置行列名 rownames(freq_table_sapply) <- unique_types colnames(freq_table_sapply) <- unique_districts # 转为数据框 as.data.frame(freq_table_sapply)
方法3:使用tidyverse的pivot_wider(适合数据框工作流)
若习惯tidyverse工具链,可先统计分组频率再转宽表,可读性高:
library(tidyverse) df %>% count(Type, District) %>% pivot_wider(names_from = District, values_from = n, values_fill = 0)
关键提示
table()默认自动补全0值,且处理大数据时效率最优;- 三种方案均无需手动适配Type/District的数量,9种Type、31个District的场景下直接复用即可;
table()返回的对象可直接用于后续统计分析(如卡方检验)。
内容的提问来源于stack exchange,提问作者Léo
相关产品推荐
相关产品推荐

