基于重复代码关联事件的R语言分组ID生成需求
解决基于event和code关联生成分组ID的问题
思路说明
这个问题核心是识别通过code关联的event连通组:只要两个event共享任意一个code,它们就属于同一组,组内所有event对应的行将共用同一个group_id。我们可以借助图论中的「连通分量」概念来实现,具体步骤如下:
代码实现
先加载所需R包(未安装的话先运行install.packages(c("dplyr", "tidyr", "igraph", "purrr"))):
library(dplyr) library(tidyr) library(igraph) library(purrr)
处理原始数据并生成目标group_id:
# 原始数据集 data <- data.frame( event = c("1", "1", "2", "2", "3", "3", "3"), code = c("64 2 16 204", "64 204", "70 2 05 002", "70 002", "60 1 15 001","64 2 16 204", "60 1 15 076") ) # 1. 整理每个code对应的唯一event集合 code_event_map <- data %>% distinct(event, code) %>% group_by(code) %>% summarise(events = list(event)) %>% ungroup() # 2. 生成event间的关联边:同一code下的event两两建立连接 edges <- code_event_map %>% mutate(edges = map(events, ~combn(.x, 2, simplify = FALSE))) %>% unnest(edges) %>% unnest_wider(edges, names_sep = "_") %>% select(edge1 = edges_1, edge2 = edges_2) # 3. 构建图结构并提取连通分量 graph <- graph_from_data_frame(edges, directed = FALSE) component_info <- components(graph) # 4. 为每个event分配对应的group_id event_group <- tibble( event = names(component_info$membership), group_id = as.character(component_info$membership) ) # 5. 将group_id合并回原始数据集 result <- data %>% left_join(event_group, by = "event") # 查看最终结果 print(result)
输出结果
运行代码后将得到你期望的输出:
event code group_id 1 1 64 2 16 204 1 2 1 64 204 1 3 2 70 2 05 002 2 4 2 70 002 2 5 3 60 1 15 001 1 6 3 64 2 16 204 1 7 3 60 1 15 076 1
补充说明
- 该方法支持多层级关联:比如event1和2共享codeA,event2和3共享codeB,会自动将1、2、3归为同一组
- 用
distinct(event, code)避免重复处理同一event-code组合,保证关联关系的准确性
内容的提问来源于stack exchange,提问作者Coralie
相关产品推荐
相关产品推荐

