在 igraph 中支持稀疏网络
support in igraph for sparse networks
我正在处理稀疏网络数据集。数据集中的顶点 ID 可能包含 1 到 4000 之间的值。例如,一小部分数据可能包含值 2、300、400、700、3000 等。
我不清楚 igraph 库是只接受稀疏数据集还是需要一系列值。
在我调用任何 igraph 函数之前,我是否必须 redefine/remap 我的数据集进入一个连续的数据范围,例如重新映射数据值如下:
- 2 变成 1
- 300 变成 2
- 400 变成 3
- 700 变成 4
- 3000 变成 5
然后调用一个 igraph 函数,在 Igraph 函数完成后做一个反向映射,或者我可以只在范围 2,300,400,700,3000
上调用 igraph 函数而不做任何重新映射吗?
igraph
顶点和边索引始终是整数的连续范围,即如果在 R igraph
中有 20 个节点,顶点索引将从 1
到 20
并且在 Python igraph
从 0
到 19
。此外,如果您添加或删除元素,则不能保证索引保持不变。因此,解决方案是使用索引创建一个顶点属性。例如:
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
我正在处理稀疏网络数据集。数据集中的顶点 ID 可能包含 1 到 4000 之间的值。例如,一小部分数据可能包含值 2、300、400、700、3000 等。
我不清楚 igraph 库是只接受稀疏数据集还是需要一系列值。
在我调用任何 igraph 函数之前,我是否必须 redefine/remap 我的数据集进入一个连续的数据范围,例如重新映射数据值如下:
- 2 变成 1
- 300 变成 2
- 400 变成 3
- 700 变成 4
- 3000 变成 5
然后调用一个 igraph 函数,在 Igraph 函数完成后做一个反向映射,或者我可以只在范围 2,300,400,700,3000
上调用 igraph 函数而不做任何重新映射吗?
igraph
顶点和边索引始终是整数的连续范围,即如果在 R igraph
中有 20 个节点,顶点索引将从 1
到 20
并且在 Python igraph
从 0
到 19
。此外,如果您添加或删除元素,则不能保证索引保持不变。因此,解决方案是使用索引创建一个顶点属性。例如:
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