You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:45:24