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

如何高效重分类分类变量?多水平变量实操优化方案求助

高效的分类变量重编码方法

嗨,我来给你分享几个更高效的分类变量重编码方法,不管后续你的变量有多少个水平,都能轻松搞定,再也不用一个个写冗长的判断语句啦!

先模拟一下你的数据集方便演示(和你给出的频数比例一致):

set.seed(123)
S6 <- sample(c("BBA", "CSE", "Math", "Economics", "Botany", "Pharmacy"), 
             size = 100, replace = TRUE, 
             prob = c(291,10,1,33,498,333)/sum(c(291,10,1,33,498,333)))
bachelor <- data.frame(S6)

方法一:用dplyr::case_when(逻辑清晰,适合快速编码)

这个方法只需要写两个核心条件,剩下的所有情况自动归为Other,哪怕以后新增更多水平,也不用修改代码:

library(dplyr)

bachelor <- bachelor %>%
  mutate(S6_recode = case_when(
    # 把指定水平归为Life Science
    S6 %in% c("Pharmacy", "Botany") ~ "Life Science",
    # 所有其他情况统一归为Other
    TRUE ~ "Other"
  ))

如果想用数字1和2表示,只需要把字符串换成对应的数字即可:~ 1和~ 2。

方法二:用forcats::fct_collapse(专为因子变量设计)

如果你的S6是因子类型,用这个包的函数最贴合需求,还能保留因子的特性:

library(forcats)

# 手动指定分组的写法
bachelor$S6_recode <- fct_collapse(bachelor$S6,
  `Life Science` = c("Pharmacy", "Botany"),
  Other = c("BBA", "CSE", "Math", "Economics")
)

# 更高效的补集写法(不用手动列所有Other的水平)
life_science_levels <- c("Pharmacy", "Botany")
other_levels <- setdiff(levels(bachelor$S6), life_science_levels)

bachelor$S6_recode <- fct_collapse(bachelor$S6,
  `Life Science` = life_science_levels,
  Other = other_levels
)

这个写法的优势是,哪怕后续S6新增了10个甚至更多水平,你只需要维护life_science_levels这个向量,Other的部分会自动取补集,超级省心!

方法三:用命名向量做映射(灵活复用)

如果这个重编码规则需要重复使用,用命名向量做映射是个好选择,只需要维护映射规则即可:

# 先创建映射向量:键是原水平,值是新分类
recode_map <- setNames(rep("Other", length(levels(bachelor$S6))), levels(bachelor$S6))
# 把需要归为Life Science的水平替换掉
recode_map[c("Pharmacy", "Botany")] <- "Life Science"

# 应用映射到数据上
bachelor$S6_recode <- recode_map[bachelor$S6]
# 如果需要转成因子类型:
bachelor$S6_recode <- factor(recode_map[bachelor$S6])

上面三种方法都能帮你大幅简化重编码的工作,尤其是当变量水平超过10个的时候,效率提升特别明显!

内容的提问来源于stack exchange,提问作者Shakil Ahmed Shaon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 06:57:35