如何为另一列取值相同的行分配统一唯一编码(R语言数据处理)
R语言为重复值列分配唯一分组编码方案
方法1:基础R实现
无需额外安装依赖包,直接用内置函数即可实现需求:
# 原示例数据,先转为数据框更方便处理 ID <- c("A", "B", "C", "D", "E") Dose <- c("1", "5", "3", "4", "5") Value <- c("x1", "x2", "x3", "x2", "x3") df <- data.frame(ID, Dose, Value) # 按Value第一次出现的顺序分配唯一Code,与你预期输出逻辑完全一致 df$Code <- as.integer(factor(df$Value, levels = unique(df$Value)))
如果不需要按出现顺序、希望按Value的字典序分配编码,直接去掉levels参数即可:df$Code <- as.integer(factor(df$Value))
方法2:tidyverse(dplyr)实现
如果常用tidyverse生态,用分组ID函数逻辑更直观:
library(dplyr) df <- df %>% # 按Value列分组 group_by(Value) %>% # 为每个分组分配唯一id mutate(Code = cur_group_id()) %>% ungroup()
如果需要按Value第一次出现的顺序分配编码,添加一行因子顺序调整代码即可:
library(dplyr) library(forcats) df <- df %>% mutate(Value = fct_inorder(Value)) %>% group_by(Value) %>% mutate(Code = cur_group_id()) %>% ungroup()
补充说明
- 两种方案处理数十万行级别的数据集都没有性能问题,完全适配你数千行数百列的数据集需求
- 如果需要Code不是纯数字、而是带自定义前缀的唯一值,只需要把生成的Code拼接前缀即可,比如
df$Code = paste0("GROUP_", df$Code)
内容的提问来源于stack exchange,提问作者Gabriel Metegnier
相关产品推荐
相关产品推荐

