R语言实现连续变量区间化绝对频率与相对频率计算
解决方法
你原有代码存在两个核心问题:
table(datos$V1)是对原始向量里的每一个独立数值做频次统计,没有按你计算得到的k个区间做分组,输出结果不是你需要的分组频率- 存在大小写笔误:
vectordatos <- datos$v1中的列名是大写V1,R对大小写敏感,这行代码运行会直接报错。
你调用hist()生成的对象里已经存储了分组区间、每个区间的样本计数,直接提取即可使用,不需要重复做分组计算。
修正后可直接运行的代码
read.table("datos.txt", header = FALSE) -> datos largo <- length(datos$V1) # 按Sturges法则计算分组数k k <- round(1 + log2(largo), digits = 0) # 生成直方图对象,添加plot=F参数可避免直接弹出绘图窗口 histograma <- hist(datos$V1, breaks = k, plot = FALSE) # 提取每个区间的绝对频率 FA <- histograma$counts # 计算对应区间的相对频率 FR <- FA / largo # 为结果添加区间标签,提升可读性 interval_tags <- paste0( "[", round(histograma$breaks[-length(histograma$breaks)], 2), ", ", round(histograma$breaks[-1], 2), c(rep(")", length(histograma$breaks)-2), "]") ) names(FA) <- interval_tags names(FR) <- interval_tags # 打印输出结果 FA FR
如果需要整理成规范的频率表数据框,补充以下代码即可:
freq_table <- data.frame( 分组区间 = interval_tags, 绝对频率 = FA, 相对频率 = FR, row.names = NULL )
替代实现方案
如果不想依赖hist的返回结果,也可以用cut()函数直接对原始数据做分箱统计,结果和上述方法基本一致:
# 按k个区间切分数据 binned_data <- cut(datos$V1, breaks = k) FA <- table(binned_data) FR <- prop.table(FA) # 该函数直接计算相对频率,效果和除以总样本量完全一致
用你提供的36条测试样本运行代码,最终会得到7个分组,对应绝对频次分别为1、2、6、10、8、6、3,所有组的相对频率加总为1,完全符合连续变量分组频率统计的要求。
内容的提问来源于stack exchange,提问作者nicx01
相关产品推荐
相关产品推荐

