R语言中实现频数表转比例表(prop table)的方法与函数
R语言频数表转比例表解决方案
内置函数说明
R 原生自带专门用于生成比例表的内置函数 prop.table(),属于 base 核心功能集,无需安装任何第三方包即可调用,是频数转比例场景的官方原生实现。
函数语法非常简单:
prop.table(x, margin = NULL)
参数说明:
x:输入的数值型频数矩阵、数组或表对象margin:计算比例的维度,1代表按行归一化(每行比例和为1),2代表按列归一化(每列比例和为1),留空则计算全局占比(所有单元格比例和为1)
针对本次样例数据的最简实现
你提供的样例数据包含3类列:第一列Time是周次标识(非数值维度列)、第二列Total是提前统计好的单周总频数次、第3列到最后一列是各内容渠道的分类型频数。
最贴合该数据结构的零依赖最简实现(无需加载任何包)如下:
# 假设原始频数表已赋值给变量df prop_df <- df # 直接用各渠道频数除以单周Total值,得到单周内各渠道占比,结果保留4位小数 prop_df[, 3:ncol(prop_df)] <- round(prop_df[, 3:ncol(prop_df)] / prop_df$Total, 4)
如果你的频数表没有提前计算好行合计列,直接提取纯频数列传入prop.table()即可一步生成结果,针对样例数据的写法为:
# 提取纯渠道频数列转为矩阵,按行计算比例 channel_prop <- prop.table(as.matrix(df[, 3:ncol(df)]), margin = 1) # 拼接回时间标识列得到完整比例表 prop_df <- cbind(Time = df$Time, as.data.frame(channel_prop))
其他常见比例计算场景
- 计算全局占比(每个单元格频数占全样本总频数的比例):去掉
margin参数即可,写法为prop.table(as.matrix(df[, 3:ncol(df)])) - 计算列占比(单渠道各周频数占该渠道全周期总频数的比例):将
margin参数设为2即可,写法为prop.table(as.matrix(df[, 3:ncol(df)]), margin = 2) - 如果你日常使用tidyverse生态,也可以用dplyr实现行级比例计算,代码可读性更强但需要提前加载包:
library(dplyr) prop_df <- df %>% mutate(across(Blog:Video, ~ round(.x / Total, 4)))
内容的提问来源于stack exchange,提问作者xnhZZZ
相关产品推荐
相关产品推荐

