如何用R将多分类问题转换为少分类问题(以8类转4类为例)
在R中高效实现多分类转少分类
一、等间隔批量合并(适合8转4、32转8这类规则场景)
如果是每n个连续类别合并为一个新类别,用整数除法或cut()函数最省心,不用逐个写判断:
示例1:8类转4类(每2个一组)
library(dplyr) # 假设数据集为df,响应变量Y是1-8的数值型 # 方法1:整数除法生成分组编号,再映射标签 df <- df %>% mutate( new_Y_num = (Y + 1) %/% 2, # 得到1-4的分组编号 new_Y_label = c("I", "II", "III", "IV")[new_Y_num] ) # 方法2:用cut()直接生成带标签的分组 df <- df %>% mutate(new_Y_label = cut(Y, breaks = seq(0, 8, by = 2), labels = c("I", "II", "III", "IV")))
示例2:32类转8类(每4个一组)
# 整数除法方式 df <- df %>% mutate( new_Y_num = (Y + 3) %/% 4, # 得到1-8的分组编号 new_Y_label = paste0("Class_", new_Y_num) ) # cut()方式 df <- df %>% mutate(new_Y_label = cut(Y, breaks = seq(0, 32, by = 4), labels = paste0("Class_", 1:8)))
二、自定义非等间隔分组
如果分组规则不是连续等间隔,用dplyr::recode()定义映射表,比逐个ifelse或case_when更简洁:
# 定义映射规则:键是原类别,值是新类别 y_map <- c( "1" = "I", "2" = "I", "3" = "II", "4" = "II", "5" = "III", "6" = "III", "7" = "IV", "8" = "IV" ) # 替换原Y列 df <- df %>% mutate(new_Y = recode(Y, !!!y_map))
关键优势
- 批量分组场景:整数除法/
cut()一行代码搞定,无需重复写判断逻辑; - 自定义分组场景:映射表清晰易维护,修改规则只需调整向量,不用改代码结构。
内容的提问来源于stack exchange,提问作者PRITI
相关产品推荐
相关产品推荐

