创建一对 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
变量中的公共元素连接的对都具有相同的代码。
例如:
- 第 1 对(1 和 2)有 ID_group = 1
- 第 2 对(2 和 4)与第 1 对有 2 个共同点,因此 ID_pair = 1
- 第 3 对(3 和 5)与第 1 对和第 2 对没有共同元素,但与第 4 对有 3 个共同元素(而第 4 对又与第 1 对有 1 个共同元素),所以它仍然应该是1
- 第 4 对(1 和 3)将是第 1 对,因为它与第 1 对和第 2 对有一个共同元素
- 第 5 对没有任何共同元素,所以它应该是 2(或其他)
期望的结果是
> 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
一些可能有用的额外注释:
- ID_pair 是分类的(所有 ID 变量也是如此)并且不需要是连续的,只需对每个组都是唯一的。我只是使用数字,因为它必须用 22k 个条目来完成。
- 如果有助于概念化,ID 代表相关的个人。 ID_group 将是他们所属的标识符系列。
- 数据不一定要保持成对的形式,也可以是“长”形式(我经常需要pair/unpair)。
- 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
我有以下数据:
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
变量中的公共元素连接的对都具有相同的代码。
例如:
- 第 1 对(1 和 2)有 ID_group = 1
- 第 2 对(2 和 4)与第 1 对有 2 个共同点,因此 ID_pair = 1
- 第 3 对(3 和 5)与第 1 对和第 2 对没有共同元素,但与第 4 对有 3 个共同元素(而第 4 对又与第 1 对有 1 个共同元素),所以它仍然应该是1
- 第 4 对(1 和 3)将是第 1 对,因为它与第 1 对和第 2 对有一个共同元素
- 第 5 对没有任何共同元素,所以它应该是 2(或其他)
期望的结果是
> 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
一些可能有用的额外注释:
- ID_pair 是分类的(所有 ID 变量也是如此)并且不需要是连续的,只需对每个组都是唯一的。我只是使用数字,因为它必须用 22k 个条目来完成。
- 如果有助于概念化,ID 代表相关的个人。 ID_group 将是他们所属的标识符系列。
- 数据不一定要保持成对的形式,也可以是“长”形式(我经常需要pair/unpair)。
- 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