在 igraph 中支持稀疏网络

support in igraph for sparse networks

我正在处理稀疏网络数据集。数据集中的顶点 ID 可能包含 1 到 4000 之间的值。例如,一小部分数据可能包含值 2、300、400、700、3000 等。

我不清楚 igraph 库是只接受稀疏数据集还是需要一系列值。

在我调用任何 igraph 函数之前,我是否必须 redefine/remap 我的数据集进入一个连续的数据范围,例如重新映射数据值如下:

然后调用一个 igraph 函数,在 Igraph 函数完成后做一个反向映射,或者我可以只在范围 2,300,400,700,3000 上调用 igraph 函数而不做任何重新映射吗?

igraph 顶点和边索引始终是整数的连续范围,即如果在 R igraph 中有 20 个节点,顶点索引将从 120 并且在 Python igraph019。此外,如果您添加或删除元素,则不能保证索引保持不变。因此,解决方案是使用索引创建一个顶点属性。例如:

require(igraph)

vertices <- sample(1:4000, 20, replace=F)
source   <- sample(vertices, 40, replace = T)
target   <- sample(vertices, 40, replace = T)
edges    <- data.frame(source = source, target = target)
g        <- graph.data.frame(edges)

g
IGRAPH DN-- 20 40 --
+ attr: name (v/c)
+ edges (vertex names):
[1] 2943->3671 822 ->1587 922 ->1694 822 ->1096 1694->1739 922 ->1096
[7] 922 ->1739 1739->1587 2943->2666 2891->2956 1096->822  267 ->839 
[13] 2891->2666 767 ->839  767 ->2956 1694->523  839 ->1739 1096->3641
[19] 1348->1739 350 ->839  1096->267  523 ->922  3641->1739 267 ->699 
[25] 523 ->1739 1587->699  267 ->1096 1587->3641 523 ->1587 1739->839 
[31] 1587->3641 1348->267  1694->350  1587->755  1348->922  839 ->2666
[37] 1739->699  922 ->1348 3641->2891 1096->2943

注意 igrap 自动创建顶点属性 name 来存储原始索引,而内部索引像往常一样是 1:20。顶点 2943 将始终使用此名称,除非您更改它,而其当前索引为 1 但它可以在重新索引时更改。

vertex.attributes(g)
$name
[1] "2943" "822"  "922"  "1694" "1739" "2891" "1096" "267"  "767"  "839" 
[11] "1348" "350"  "523"  "3641" "1587" "3671" "2666" "2956" "699"  "755"

V(g)[1]
+ 1/20 vertex, named:
[1] 2943

V(g)[V(g)$name == 2943]
+ 1/20 vertex, named:
[1] 2943