如何基于id和class两列值为R语言数据框生成newid列?
问题描述
现有如下R语言数据框,需要结合id和class两列生成名为newid的新列。同一id值可能对应不同class值,因此需基于id与class的唯一配对关系创建新ID——每一组唯一的(id, class)对应一个唯一的newid,重复的配对则共享同一个newid。
数据定义代码:
data <- data.frame(id=c(1,1,1,1,1, 2,2,2,2,2,3,3,3,3,1,1,1,1,2,2,2,4,4,4), class=c('x','x','x','x','x', 'y','y','y','y','y', 'z','z','z','z', 'w','w','w','w', 'v','v','v','n','n','n'))
预期输出:
id class newid 1 1 x 1 2 1 x 1 3 1 x 1 4 1 x 1 5 1 x 1 6 2 y 2 7 2 y 2 8 2 y 2 9 2 y 2 10 2 y 2 11 3 z 3 12 3 z 3 13 3 z 3 14 3 z 3 15 1 w 4 16 1 w 4 17 1 w 4 18 1 w 4 19 2 v 5 20 2 v 5 21 2 v 5 22 4 n 6 23 4 n 6 24 4 n 6
解决方案
以下提供几种简洁的实现方式:
Base R 方法
方法1:使用interaction()函数
interaction()可以直接将多列组合成因子,再转换为数值即可得到连续的唯一ID:
data$newid <- as.numeric(factor(interaction(data$id, data$class, drop = TRUE)))
参数drop = TRUE会自动移除未出现的配对组合,确保ID是连续无间隔的。
方法2:拼接字符串后转因子
先将id和class拼接成唯一字符串,再转换为因子和数值:
data$newid <- as.numeric(factor(paste(data$id, data$class, sep = "_")))
Tidyverse/dplyr 方法
方法1:使用group_indices()
通过分组索引直接生成唯一ID:
library(dplyr) data <- data %>% mutate(newid = group_indices(., id, class))
方法2:使用cur_group_id()(dplyr 1.0.0及以上版本)
这是dplyr更新后的更直观写法:
library(dplyr) data <- data %>% group_by(id, class) %>% mutate(newid = cur_group_id()) %>% ungroup()
以上所有方法运行后,生成的newid列都将与预期输出完全一致。
内容的提问来源于stack exchange,提问作者Mahlet Tadesse
相关产品推荐
相关产品推荐

