如何将R语言中含重复值的有序向量old转换为new列?
几种简便实现方法
针对你需要将有序重复的old列转换为按值出现顺序生成的连续序号new列的需求,这里有几种简洁的实现方式:
基础R方法
方法1:使用match()(最简洁)
利用match()函数匹配每个元素在old列唯一值序列中的位置,直接生成连续序号:
df$new <- match(df$old, unique(df$old))
原理:unique(df$old)会按old列值的出现顺序提取所有不重复值,match()返回每个old元素在这个唯一值向量中的索引,正好对应你需要的连续序号。
方法2:使用factor()转整数
将old列转为因子(指定水平为唯一值的出现顺序),再转换为整数类型:
df$new <- as.integer(factor(df$old, levels = unique(df$old)))
原理:因子的水平会按levels参数指定的顺序排列,转换为整数后就得到了对应水平的序号,完美匹配需求。
tidyverse方法(dplyr)
如果你习惯使用tidyverse工具,可以通过分组后生成组ID来实现:
library(dplyr) # 方法1:使用cur_group_id() df <- df %>% group_by(old) %>% mutate(new = cur_group_id()) %>% ungroup() # 方法2:使用group_indices() df$new <- group_indices(df, old)
原理:按old列分组后,cur_group_id()或group_indices()会给每个不同的组分配一个连续的ID,自动对应每个old值的出现顺序。
内容的提问来源于stack exchange,提问作者hokeybot
相关产品推荐
相关产品推荐

