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

在R语言中按频率将分类变量重编码为数值后还原为原分类的实现

分类变量编码还原方案(适配大量唯一值场景)

核心思路:建立编码-原始值映射表

针对大量唯一值的场景,必须依赖映射关系而非分支判断(如case_when),先从已编码数据中提取唯一的编码与原始值对应关系,后续还原直接复用该映射即可。

步骤1:生成映射表

从你的df1中提取每个编码值对应的原始分类值:

# 提取x(原始分类)和x_new(编码值)的唯一映射
code_mapping <- df1 %>% distinct(x, x_new)

这个映射表会自动适配所有唯一分类值,无需手动维护分支规则。

步骤2:还原操作

方法一:数据框级还原(用left_join)

如果你的数据是数据框格式,直接关联映射表即可完成还原:

# 假设你有一个仅含编码列的数据框(比如处理后的计算结果)
processed_df <- df1 %>% select(x_new, ...) # ...代表其他计算生成的列

# 关联映射表,还原原始分类
decoded_df <- processed_df %>% left_join(code_mapping, by = "x_new")

方法二:向量级还原(用match)

如果只是单独处理编码向量,直接用向量匹配更高效:

# 假设你有一个编码后的向量
encoded_vec <- df1$x_new

# 匹配映射表,得到原始值向量
decoded_vec <- code_mapping$x[match(encoded_vec, code_mapping$x_new)]

补充:修正初始编码(按「稀有→频繁」顺序)

你的示例代码中cur_grp_id()是按分组出现的顺序编码,并非按频率排序。如果需要严格按频率从稀有到频繁编码,初始步骤需先按计数排序:

df <- tibble(x = c(rep("A", 10), rep("B", 15), rep("C", 23), rep("D", 40)))

# 按频率升序(稀有在前)分组编码
df1 <- df %>%
  add_count(x) %>%          # 计算每个分类的出现次数
  arrange(n) %>%            # 按次数从小到大排序
  group_by(x) %>%
  mutate(x_new = cur_grp_id()) %>%
  ungroup() %>%
  select(-n)                # 移除计数辅助列

这样x_new的数值越小,对应的分类越稀有,完全符合需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:53:29