创建一对 ID 的组,每个组具有共同的 ID

Create groups of pair of IDs, with each group having IDs in common

我有以下数据:

a <- structure(list(ID.x = c(1, 2, 3, 1, 6), ID.y = c(2, 4, 5, 3,
7), var.x = c(55, 82, 32, 94, 55), var.y = c(86, 24, 68, 63,
77)), class = "data.frame", row.names = c(NA, -5L))
> a
  ID.x ID.y var.x var.y
1    1    2    55    86
2    2    4    82    24
3    3    5    32    68
4    1    3    94    63
5    6    7    55    77

我需要创建一个变量,以便给定 ID 对,所有由 ID 变量中的公共元素连接的对都具有相同的代码。

例如:

期望的结果是

> a
  ID.x ID.y var.x var.y ID_group
1    1    2    55    86       1
2    2    4    82    24       1
3    3    5    32    68       1
4    1    3    94    63       1
5    6    7    55    77       2

一些可能有用的额外注释:

  1. ID_pair 是分类的(所有 ID 变量也是如此)并且不需要是连续的,只需对每个组都是唯一的。我只是使用数字,因为它必须用 22k 个条目来完成。
  2. 如果有助于概念化,ID 代表相关的个人。 ID_group 将是他们所属的标识符系列。
  3. 数据不一定要保持成对的形式,也可以是“长”形式(我经常需要pair/unpair)。
  4. R 中的解决方案最好,但我对获得它的算法比实际编码更感兴趣

提前感谢您的帮助!

一种方式:

使用 igraph:

library(igraph)

memb <- components(graph_from_data_frame(a))$membership
a$ID_group <- memb[as.character(a$ID.x)]

  ID.x ID.y var.x var.y ID_group
1    1    2    55    86        1
2    2    4    82    24        1
3    3    5    32    68        1
4    1    3    94    63        1
5    6    7    55    77        2