使用R代码创建区间频率表直方图时遇错,求解决方案
问题诊断与修复方案
错误原因
你生成breaks的代码逻辑有误:as.numeric(gsub("\\[|\\)|\\(|\\]", "", unique(df$ClassInterval)))处理后得到的是"0, 10"这类带逗号的字符串,直接转换数值会失败,返回全NA的向量,导致hist函数无法识别有效断点,触发报错。
修复步骤
核心是生成包含所有区间端点的有序数值向量,有两种高效方式:
- 自动提取断点:从区间字符串中拆分出所有端点,去重后排序
- 手动指定断点:因你的区间是规则的10步长区间,可直接生成序列
完整修正代码
# 匹配你提供的频率表数据,修正Frequency数值 df <- data.frame( ClassInterval = c("[0, 10)", "[10, 20)", "[20, 30)", "[30, 40)", "[40, 50)"), Frequency = c(5, 18, 12, 6, 9) ) # 提取组中值(也可直接使用表格里的组中值5,15,25,35,45) class_intervals <- gsub("\\[|\\)|\\(|\\]", "", df$ClassInterval) class_midpoints <- sapply(strsplit(class_intervals, ", "), function(x) mean(as.numeric(x))) # 方法1:自动提取所有区间端点作为断点 interval_parts <- strsplit(gsub("\\[|\\)|\\(|\\]", "", df$ClassInterval), ", ") breaks <- sort(unique(as.numeric(unlist(interval_parts)))) # 方法2:手动指定断点(适合规则步长的区间) # breaks <- seq(0, 50, by=10) # 生成直方图 hist(class_midpoints, breaks = breaks, weights = df$Frequency, col = "skyblue", xlab = "身高(英寸)", main = "身高频数直方图")
说明
- 修正后的
breaks为c(0,10,20,30,40,50),符合hist函数对断点的要求:长度比组数多1的递增数值向量 - 同步修正了
Frequency的数值,与你提供的区间频率表一致,确保统计结果准确
内容的提问来源于stack exchange,提问作者Saïd Maanan
相关产品推荐
相关产品推荐

