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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:28:32