为每个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
相关产品推荐
相关产品推荐

