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

为每个ID的唯一观测集合分配累积标识符

问题:为分组的唯一观测集合分配累积标识符

我有一个包含两列的dataframe:id列(分组标识)和val列(观测值,取值为a-g的随机排列),数据如下:

df <- data.frame(
  id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L),
  val = c("a", "b", "c", "d", "e", "f", "a", "b", "b", "a", "c", "e", "d", "a", "b","c","f","g")
)

打印后的数据:

id val
1   1   a
2   1   b
3   1   c
4   1   d
5   1   e
6   2   f
7   2   a
8   2   b
9   3   b
10  3   a
11  3   c
12  3   e
13  3   d
14  4   a
15  4   b
16  4   c
17  4   f
18  4   g

我需要为每个id对应的val列中的唯一观测集合分配一个累积标识符valid:若两个id对应的val唯一集合完全相同(不考虑元素顺序),则分配同一个valid值;不同的集合分配递增的标识符。预期结果如下:

id val valid
1   1   a     1
2   1   b     1
3   1   c     1
4   1   d     1
5   1   e     1
6   2   f     2
7   2   a     2
8   2   b     2
9   3   b     1
10  3   a     1
11  3   c     1
12  3   e     1
13  3   d     1
14  4   a     3
15  4   b     3
16  4   c     3
17  4   f     3
18  4   g     3

解决方案

方法1:使用dplyr(tidyverse风格)

library(dplyr)

df_result <- df %>%
  # 按id分组,将每组的唯一val排序后拼接成字符串(统一集合格式)
  group_by(id) %>%
  mutate(val_set = paste(sort(unique(val)), collapse = ",")) %>%
  ungroup() %>%
  # 为不同的val_set分配递增的整数标识符
  mutate(valid = as.integer(factor(val_set, levels = unique(val_set)))) %>%
  # 移除中间辅助列
  select(-val_set)

print(df_result)

方法2:使用data.table(适合大数据场景)

library(data.table)

setDT(df)
# 生成每组的唯一集合字符串
df[, val_set := paste(sort(unique(val)), collapse = ","), by = id]
# 按集合分组,分配累积标识符
df[, valid := .GRP, by = val_set]
# 删除辅助列
df[, val_set := NULL]

print(df)

两种方法核心逻辑一致:先将每个分组的唯一观测值排序后转为统一格式的字符串(消除顺序差异),再为不同的字符串分配递增的整数ID,最后合并回原数据。


内容的提问来源于stack exchange,提问作者maxxzi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:26:24