R语言如何为分类(因子)变量制作频数分布及解决报错
错误原因
你的代码存在两个核心逻辑错误:
- 对多列数据框直接调用
table():table()接收多列输入时,会生成所有变量取值组合的高维交叉列联表。你保留的34个变量均为分类变量,即使每个变量仅2个取值,总组合数也达到234,远超R单表231个元素的上限,因此报元素过多的错误。你需要的是单个变量的边际频数分布,不是跨变量交叉统计。 - 误用
hist()绘制分类变量分布:hist()是仅支持数值型输入的连续变量直方图函数,Soybean数据集剔除前两列后剩余字段全是因子型分类变量,传入hist()必然触发'x' must be numeric报错。分类变量的分布可视化应使用条形图barplot()。
修复代码
library(mlbench) data(Soybean) soy = Soybean[,-c(1,2)] # 批量输出所有分类变量的频数、频率表 lapply(names(soy), function(var_name){ cat("===== ", var_name, " =====\n") freq <- table(soy[[var_name]]) cat("频数:\n") print(freq) cat("频率:\n") print(round(prop.table(freq), 3)) cat("\n") }) # 批量绘制分布条形图 par(mfrow = c(17, 2), mar = c(3,2,2,1)) for (i in seq_along(soy)) { var_name <- names(soy)[i] barplot(prop.table(table(soy[[i]])), main = paste(var_name, "分布"), col = "deepskyblue", cex.names = 0.7) } par(mfrow = c(1,1)) # 恢复默认绘图排版
注意事项
- 不要直接对包含大量分类变量的整个数据框调用
table(),分类变量的交叉组合量级会随变量数指数增长,很容易直接占满内存报错。 - 直方图和条形图适用场景完全不同:直方图用于展示连续数值变量的区间分布,条形图用于展示分类变量的类别计数/占比,不要混用。
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

