如何在R语言中按元素出现频率和输入顺序对向量进行重排序
R语言按元素频率与首次出现顺序重编码向量方案
核心逻辑
你需要的编码规则可以拆解为两个优先级的排序条件:
- 第一优先级:元素出现频率越高,对应的编码值越小
- 第二优先级:频率相同的元素,在原向量中首次出现的时间越早,对应的编码值越小
只需要手动构造符合上述顺序的因子层级,再将原向量转为因子后转数值即可实现需求,不需要依赖额外扩展包。
实现代码
封装通用函数
recode_by_freq_order <- function(x) { # 提取按首次出现顺序排列的唯一元素 unique_x <- unique(x) # 统计每个唯一元素的出现频率 freq <- table(x)[as.character(unique_x)] # 按【频率降序+首次出现顺序升序】排序得到目标层级 sorted_levels <- unique_x[order(-freq, seq_along(unique_x))] # 映射为编码值 as.numeric(factor(x, levels = sorted_levels)) }
测试样例验证
# 测试1 Z1 <- c(1,1,1,2,2) recode_by_freq_order(Z1) # 输出 [1] 1 1 1 2 2 # 测试2 Z2 <- c(2,2,2,1,1) recode_by_freq_order(Z2) # 输出 [1] 1 1 1 2 2 # 测试3 Z3 <- c(2,3,5,5,4) recode_by_freq_order(Z3) # 输出 [1] 2 3 1 1 4 # 测试4 Z4 <- c(2,4,5,5,3) recode_by_freq_order(Z4) # 输出 [1] 2 3 1 1 4
原代码问题说明
你之前使用rank()的思路存在偏差:rank()函数是按元素的数值大小计算排名,无法感知元素的出现频率和输入先后顺序,因此不能直接用于该场景。核心是要自定义因子的levels顺序,因子转数值时会自动按levels的顺序生成1、2、3...的编码,刚好匹配需求。
内容的提问来源于stack exchange,提问作者pineapple
相关产品推荐
相关产品推荐

