如何高效重分类分类变量?多水平变量实操优化方案求助
高效的分类变量重编码方法
嗨,我来给你分享几个更高效的分类变量重编码方法,不管后续你的变量有多少个水平,都能轻松搞定,再也不用一个个写冗长的判断语句啦!
先模拟一下你的数据集方便演示(和你给出的频数比例一致):
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
相关产品推荐
相关产品推荐

