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

R语言按CLASS分组统计多分类变量的简便实现方法求助

简便实现Soybean数据集按CLASS分组统计分类变量

嘿,刚接触R不用慌!针对你用mlbench包的Soybean数据集,想要按CLASS(19个水平)分组统计35个分类变量的频数、NA数量和众数,确实有比手动逐个处理更简便的方法。下面推荐两种常用的高效实现方式,新手友好且代码简洁:

方法一:用tidyverse生态(dplyr+tidyr+purrr)

这个组合代码可读性强,适合刚入门的R用户,先确保安装并加载所需包:

# 安装所需包(首次使用时执行)
install.packages(c("mlbench", "dplyr", "tidyr", "purrr"))

# 加载包
library(mlbench)
library(dplyr)
library(tidyr)
library(purrr)

# 加载Soybean数据集
data(Soybean)

核心思路是把宽格式数据集转成长格式,这样所有分类变量可以统一处理,再按CLASS和变量名分组计算统计量:

# 分组统计核心代码
group_stats <- Soybean %>%
  # 把35个分类变量转成长格式,保留CLASS作为分组依据
  pivot_longer(cols = -CLASS, names_to = "variable", values_to = "value") %>%
  # 按CLASS和变量名分组
  group_by(CLASS, variable) %>%
  summarise(
    total_count = n(),  # 该分组的总样本数
    na_count = sum(is.na(value)),  # NA值的数量
    # 计算众数:取出现次数最多的类别,多众数时取第一个
    mode = names(which.max(table(value, useNA = "no"))),
    # 可选:保留完整的频数表(存为列表,方便查看详细分布)
    freq_details = list(table(value, useNA = "ifany"))
  ) %>%
  ungroup()

# 查看前几行结果
head(group_stats)

如果想把频数表展开成更直观的列(每个类别对应一列显示频数),可以再加一步:

# 展开频数表为宽格式
group_stats_wide <- group_stats %>%
  mutate(freq_details = map(freq_details, ~as.data.frame(.x) %>% 
                              t() %>% 
                              as.data.frame() %>% 
                              rownames_to_column("category"))) %>%
  unnest(freq_details) %>%
  pivot_wider(names_from = category, values_from = Freq, values_fill = 0)

head(group_stats_wide)

方法二:用data.table(高效处理大数据)

如果数据集很大,data.table的速度会更快,语法也很简洁:

# 安装并加载包
install.packages(c("mlbench", "data.table"))
library(mlbench)
library(data.table)

# 加载数据集并转为data.table格式
data(Soybean)
setDT(Soybean)

# 转长格式
soybean_long <- melt(Soybean, id.vars = "CLASS", variable.name = "variable", value.name = "value")

# 分组计算统计量
group_stats_dt <- soybean_long[, .(
  total_count = .N,
  na_count = sum(is.na(value)),
  mode = names(which.max(table(value, useNA = "no"))),
  freq_details = list(table(value, useNA = "ifany"))
), by = .(CLASS, variable)]

新手小贴士

  • 若需要保留所有众数(当多个类别出现次数相同时),可以把众数的计算代码改成:
    mode = paste(names(which(table(value, useNA = "no") == max(table(value, useNA = "no")))), collapse = ", ")
    
  • freq_details是可选的,如果只需要核心统计量(总频数、NA数、众数),可以去掉这一行,结果会更简洁。

这样就不用手动逐个变量处理啦,一次就能搞定所有35个分类变量的分组统计需求,刚学R的话先从tidyverse的方法入手,代码可读性更高,熟悉之后再尝试data.table的高效写法~

内容的提问来源于stack exchange,提问作者mathcomp guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:52:37