You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:06:26