Как получить вершинные идентификаторы из графика
Пожалуйста, рассмотрите следующие
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"