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

建模前减少因子水平:将2600个因子水平压缩至约10个的方法求助

如何将低频次因子水平合并为"other"分组

你遇到的问题很典型——处理高基数因子时,我们经常需要把出现次数极少的水平合并成一个统一的"other"分组,这样能大幅简化后续建模。先来说说你之前代码报错的原因:count(colour)不能直接放在mutate里用,count()是用来生成汇总统计表格的函数,它需要处理整个数据框或分组,没法直接返回每行对应的频次值,所以才会抛出那个关于因子类别的错误。

下面给你两种可行的解决方案,从基础实现到更简洁的专用工具都有:

方法一:用dplyr分步实现

先统计每个因子水平的出现次数,再关联回原数据进行替换:

library(dplyr)

# 你的示例数据
df <- data.frame(colour=c("blue","blue","blue","green","green","orange","grey"))

# 设定频次阈值,这里用你示例中的2
threshold <- 2

# 1. 先统计每个colour的出现次数
colour_freq <- df %>% 
  count(colour, name = "occurrences")

# 2. 关联频次数据到原表,再替换低频次为"other"
df_cleaned <- df %>%
  left_join(colour_freq, by = "colour") %>%
  mutate(colour = ifelse(occurrences < threshold, "other", colour)) %>%
  select(-occurrences) # 移除临时的频次列

print(df_cleaned)

运行后你会得到期望的结果:

colour
1   blue
2   blue
3   blue
4  green
5  green
6  other
7  other

方法二:用forcats包的专用函数(推荐)

forcats是tidyverse专门处理因子的工具包,其中fct_lump_min()就是为这种场景量身打造的,代码更简洁且不易出错:

library(dplyr)
library(forcats)

df <- data.frame(colour=c("blue","blue","blue","green","green","orange","grey"))

threshold <- 2

df_cleaned <- df %>%
  mutate(colour = fct_lump_min(colour, min = threshold, other_level = "other"))

print(df_cleaned)

这个函数会自动保留出现次数≥min的水平,把剩下的全部合并到other_level指定的分组里,完美匹配你的需求。而且处理2600个水平的大数据时,效率也很高。

内容的提问来源于stack exchange,提问作者Shinobi_Atobe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:01:46