如何从图中获取顶点ID

20

请考虑以下内容

library(igraph)
id <- c("1","2","A","B")
name <- c("02 653245","03 4542342","Peter","Mary")
category <- c("digit","digit","char","char")
from <- c("1","1","2","A","A","B")
to <- c("2","A","A","B","1","2")

nodes <- cbind(id,name,category)
edges <- cbind(from,to)

g <- graph.data.frame(edges, directed=TRUE, vertices=nodes)
现在我想使用我用来从数据帧创建图形的ID访问特定顶点,例如id < - c("1","2","A","B")。比如我想要访问第三个顶点-最初被标识为"A"。是否有办法通过类似下面的方式访问该顶点:
V(g)$id == "A"

有没有办法从name获取id?也就是说,如果我运行

which(V(g)$name == "Peter")
我得到了数字3。如何获取A而不是它?
2个回答

25

首先,igraph将顶点属性name用作顶点的符号标识。建议您将ids添加为name并为其他属性使用另一个名称,例如realname

但是,如果您使用符号名称,则通常不需要知道数字id,因为所有函数也应接受(好吧,他们应该接受)符号id。例如,如果您想要Peter顶点的度数,可以直接使用degree(g, "Peter")

如果您确实需要数字id,可以执行以下操作:

as.numeric(V(g)["Peter"])
# [1] 3
match("Peter", V(g)$name)
# [1] 3
如果你想从你的示例中通过 name 获取到 id,你可以直接使用结果来索引那个向量。
id[ match("Peter", V(g)$name) ]

按照您的示例,假设我知道在我的图形中 V(g)$namePeter,我想找到相应的符号名称 (A)。如果我执行 which(V(g)$name == "Peter",我会得到索引(3),而不是符号名称(A)。 (我更新了我的问题) - CptNemo
(在我的例子中,nameid 是生成数据框中的不同向量。) - CptNemo
我明白了。igraph使用顶点属性name作为符号ID。您仍然可以使用match,并使用结果索引idid[match("Peter", V(g)$name)] - Gabor Csardi
我发现对于某些函数,无论是否有“名称”属性,计算时间差别很大。例如强度函数: - yliueagle
仅作指出,as.numeric(V(g)["Peter"]也可以以矢量方式运行,以便快速给出所有ID,即as.numeric(V(g)[name] - nate
显示剩余4条评论

0

这个答案可能会有用。我的建议与 @Gabor Csardi 相同,使用 id 作为名称,real_name 作为姓名。

library(igraph)
name <- c("1","2","A","B")
real_name <- c("02 653245","03 4542342","Peter","Mary")
category <- c("digit","digit","char","char")
from <- c("1","1","2","A","A","B")
to <- c("2","A","A","B","1","2")

nodes <- cbind(name,real_name,category)
edges <- cbind(from,to)

g <- graph.data.frame(edges, directed=TRUE, vertices=nodes)

list.vertex.attributes(g)
#Output: [1] "name"      "real_name" "category"
which(V(g)$real_name == "Peter")
#Output: [1] 3
V(g)$name[which(V(g)$real_name == "Peter")]
#Output: [1] "A"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接