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

如何基于两列的关联值对tibble中的元素进行分组?

关联元素分组的最佳实现方式

这类需求本质是寻找无向图的连通分量:把每一行的a和b看作图中两个节点的连接边,所有相互连通的节点就属于同一分组。用igraph包可以高效解决这个问题,以下是具体实现:

步骤1:准备环境与数据

# 安装并加载必要包(首次使用需安装)
install.packages("igraph")
library(igraph)
library(tibble)

# 输入数据
df <- tibble(a = c("C1", "C2", "C12", "C15", "C12"), 
             b = c("C4", "C3", "C2", "C18", "C21"))

步骤2:构建图并计算连通分量

# 构建无向图(directed=FALSE表示边是双向关联)
g <- graph_from_data_frame(df, directed = FALSE)
# 获取每个节点所属的连通组ID
cluster_ids <- membership(cluster_components(g))

步骤3:生成期望输出

输出形式1:分组列表

group_list <- split(names(cluster_ids), cluster_ids)
# 按组ID排序,与示例顺序一致
group_list <- group_list[order(as.integer(names(group_list)))]
group_list

运行结果:

$`1`
[1] "C1" "C4"

$`2`
[1] "C2"  "C3"  "C12" "C21"

$`3`
[1] "C15" "C18"

输出形式2:分组tibble

group_tibble <- tibble(
  name = names(cluster_ids),
  id_group = as.integer(cluster_ids)
)
# 按示例指定的顺序排列行
group_tibble <- group_tibble[match(
  c("C1", "C2", "C12", "C15", "C4", "C3", "C18", "C21"), 
  group_tibble$name
), ]
group_tibble

运行结果:

# A tibble: 8 × 2
  name  id_group
  <chr>    <int>
1 C1           1
2 C2           2
3 C12          2
4 C15          3
5 C4           1
6 C3           2
7 C18          3
8 C21          2

方案优势

  • igraph专门处理图结构问题,逻辑直观,代码简洁
  • 支持大规模数据,效率远高于手动遍历判断关联关系
  • 自动处理多层关联(比如C12→C2→C3、C12→C21的嵌套关联)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:57:25