Как получить вершинные идентификаторы из графика

Пожалуйста, рассмотрите следующие

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 <- c("1","2","A","B").

Скажем, я хочу получить доступ к третьей вершине, первоначально идентифицированной с помощью "А". Есть ли способ получить доступ к вершине с чем-то вроде

V(g)$id == "A"

И все равно, чтобы получить id от name? То есть, если я запустил

which(V(g)$name == "Peter")

Я получаю 3. Как получить A вместо?

Ответ 1

Прежде всего, igraph использует атрибут вершины name как символические идентификаторы вершин. Я предлагаю вам добавить идентификаторы как name и использовать другое имя для других атрибутов, например. realname.

Но часто вам не нужно знать числовые идентификаторы, если вы используете символические имена, потому что все функции принимают (ну, они также должны) символические идентификаторы. Например. если вам нужна степень вершины Peter, вы можете просто сказать degree(g, "Peter").

Если вам действительно нужен цифровой идентификатор, вы можете делать такие вещи:

as.numeric(V(g)["Peter"])
# [1] 3
match("Peter", V(g)$name)
# [1] 3

Если вы хотите перейти к id от name в своем примере, вы можете просто индексировать этот вектор с результатом:

id[ match("Peter", V(g)$name) ]

Ответ 2

Ответ может быть полезен. Моя рекомендация такая же, как у @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"