R语言中如何将多类别分组/重编码为少数类别?
解决方案
你之前的代码无效是因为使用==与向量做比较,这会触发R的循环补齐机制,无法正确判断元素是否属于目标集合,正确的做法是使用%in%运算符。以下是几种最优实现方法:
方法1:直接基于原字符串列分组(推荐)
无需转换为数值或因子,直接针对原字符串类别分组,更直观且避免因子顺序引发的问题:
library(dplyr) cat1 <- LETTERS[seq(1,15)] df <- as.data.frame(cat1) df <- df %>% mutate(cat3 = case_when( cat1 %in% c(LETTERS[1:5], LETTERS[7], LETTERS[9]) ~ 1, cat1 %in% c(LETTERS[6], LETTERS[8], LETTERS[10], LETTERS[13]) ~ 2, cat1 %in% c(LETTERS[11:12], LETTERS[14:15]) ~ 3 ))
方法2:基于已转换的数值列cat2分组
如果坚持使用已生成的cat2数值列,修正判断逻辑即可:
df <- df %>% mutate(cat3 = case_when( cat2 %in% c(1:5,7,9) ~ 1, cat2 %in% c(6,8,10,13) ~ 2, cat2 %in% c(11:12,14:15) ~ 3 ))
方法3:用forcats包批量合并类别(适合大量类别场景)
若需处理近100个类别,forcats包的fct_collapse专为因子分组设计,操作更简洁:
library(forcats) library(dplyr) df <- df %>% mutate(cat1 = as.factor(cat1), cat3 = fct_collapse(cat1, "1" = c(LETTERS[1:5], LETTERS[7], LETTERS[9]), "2" = c(LETTERS[6], LETTERS[8], LETTERS[10], LETTERS[13]), "3" = c(LETTERS[11:12], LETTERS[14:15])) %>% as.integer())
以上方法均可实现你需要的分组效果,其中方法1和3直接基于原字符串操作,更不易出错,适合类别数量较多的场景。
内容的提问来源于stack exchange,提问作者Victor Shin
相关产品推荐
相关产品推荐

