R中基于普通分组变量与字符串列表公共元素的分组方法问询
R列表列关联分组实现方法
需求说明
普通分组变量取值匹配的前提下,列表列只要存在任意公共元素(含连通传递关联)就归为同一组。
错误方案原因
- 第一种dplyr方案:
%in%对列表列执行的是完全匹配判断,无法识别元素级别的交集匹配 - 第二种循环方案:未考虑连通传递规则(即A与B有公共元素、B与C有公共元素时,A与C即使无公共元素也需归为同一组),无法得到正确的分组结果
可行实现代码
依赖包
需要提前安装加载以下包:
install.packages(c("dplyr", "purrr", "igraph")) library(dplyr) library(purrr) library(igraph)
核心函数与调用
# 定义同普通分组内的连通分量分组函数 get_conn_grp <- function(lst_col) { n <- length(lst_col) if(n == 1) return(1) # 生成所有存在公共元素的行的边关系 edges <- combn(1:n, 2, function(pair) { if(length(intersect(lst_col[[pair[1]]], lst_col[[pair[2]]])) > 0) { return(c(pair[1], pair[2])) } return(NULL) }, simplify = FALSE) %>% compact() %>% unlist() # 构建图结构计算连通分量作为分组id g <- graph(edges = edges, directed = FALSE, n = n) as.integer(components(g)$membership) } # 生成分组结果 dat <- dat %>% group_by(cod) %>% mutate(sub_grp = get_conn_grp(lst)) %>% ungroup() %>% mutate(grp = cur_group_id(), .by = c(cod, sub_grp)) %>% select(-sub_grp)
输出验证
运行后输出结果与期望完全一致:
| cod | lst | grp |
|---|---|---|
| 1 | a,a | 1 |
| 1 | a | 1 |
| 2 | b | 2 |
| 2 | e | 3 |
| 3 | x,x | 4 |
| 3 | f,x | 4 |
| 3 | f,f | 4 |
| 4 | r,r | 5 |
| 4 | e,q | 6 |
| 5 | t,t | 7 |
| 5 | t | 7 |
内容的提问来源于stack exchange,提问作者samalevy
相关产品推荐
相关产品推荐

