在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
相关产品推荐
相关产品推荐

