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
相关产品推荐
相关产品推荐

