如何提取相互关联的 ID?

How to pull ID's that are interlinked?

我有两列 id1 和 id2,它们具有相互关联的 id 列表。我正在寻找 R 中的解决方案,可以根据它们的关系将这些 id 组合在一起。基本思想是id的313-320都是相互关联的,e.g. 313 链接到 314(第 1 行)并且因为 314 链接到 316(第 7 行)所以 313 和 316 也链接等等。解决方案必须以某种方式探索这些联系并将它们放在一条链中,这样 313-320 将在一个链中,而 321-328 将在第二个链中。

id1<-c(313,313,313,313,313,314,314,314,314,315,317,317,317,318,318,319,321,321,321,321,321,321,321,322,322,322,322,322, 322,323,323,323,323,323,324,324,324,324,325,325,325,326,326,327)

id2<-c(314,315,316,319,320,315,316,319,320,316,318,319,320,319,320,320,322,323,324,325,326,327,328,323,324,325,326,327, 328,324,325,326,327,328,325,326,327,328,326,327,328,327,328,328)

df<-cbind.data.frame(id1, id2)

> df
   id1 id2
1  313 314
2  313 315
3  313 316
4  313 319
5  313 320
6  314 315
7  314 316
8  314 319
9  314 320
10 315 316
11 317 318
12 317 319
13 317 320
14 318 319
15 318 320
16 319 320
17 321 322
18 321 323
19 321 324
20 321 325
21 321 326
22 321 327
23 321 328
24 322 323
25 322 324
26 322 325
27 322 326
28 322 327
29 322 328
30 323 324
31 323 325
32 323 326
33 323 327
34 323 328
35 324 325
36 324 326
37 324 327
38 324 328
39 325 326
40 325 327
41 325 328
42 326 327
43 326 328
44 327 328

正如@r2evans 所指出的,这个问题可以通过 igraph 库解决:

clusters(graph_from_data_frame(df, directed = FALSE))

$membership
313 314 315 317 318 319 321 322 323 324 325 326 327 316 320 328 
  1   1   1   1   1   1   2   2   2   2   2   2   2   1   1   2 

$csize
[1] 8 8

$no
[1] 2