如何在R语言中高效获取大型数据集的频次与占比?
问题描述
需要统计数据集中各分数的频次与百分比,示例数据如下:
df <- read.table(text=" A1.1 A1.2 A1.3 A1.4 A1.5 3 3 4 3 1 0 4 1 2 4 4 1 0 4 3 1 2 3 3 3 4 4 3 3 3 1 3 0 1 4 0 1 3 0 0 1 1 0 0 1 ", header=TRUE)
期望输出格式:
Score Freq Percent 0 8 20 1 10 25 2 2 5 3 12 30 4 8 20 Total 40 100
例如分数0出现8次,百分比为8/40*100=20。现需针对大型矩阵,提供简洁高效的R代码实现该需求。
解决方案
方法1:基础R实现(高效适配大型矩阵)
直接操作向量统计,避免冗余计算,适合处理大规模数据:
# 将数据框/矩阵转为一维向量 vec <- as.vector(as.matrix(df)) # 统计各分数频次 freq_table <- table(vec) # 计算百分比(取整) percent_table <- round(prop.table(freq_table) * 100) # 转换为标准数据框 result <- data.frame( Score = names(freq_table), Freq = as.numeric(freq_table), Percent = as.numeric(percent_table), stringsAsFactors = FALSE ) # 添加总计行 total_row <- data.frame( Score = "Total", Freq = sum(freq_table), Percent = 100, stringsAsFactors = FALSE ) result_final <- rbind(result, total_row) # 打印结果(隐藏行名) print(result_final, row.names = FALSE)
方法2:tidyverse实现(简洁易读)
用管道语法简化流程,适合习惯tidy风格的场景:
library(tidyverse) result_final <- df %>% # 宽表转长表,保留分数列 pivot_longer(everything(), names_to = NULL, values_to = "Score") %>% # 统计各分数频次 count(Score, name = "Freq") %>% # 计算百分比 mutate(Percent = round(Freq / sum(Freq) * 100)) %>% # 添加总计行 add_row(Score = "Total", Freq = sum(.$Freq), Percent = 100) print(result_final, row.names = FALSE)
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

