Сортировка и подмножество соседей по свойству ребра в R с помощью igraph
С помощью igraph
в R, для определенного узла x
Я хотел бы перечислить три верхних соседних узла, основываясь на свойстве ребра между x
и этот соседний узел.
Создайте ориентированный взвешенный образец графика:
set.seed(42)
library(igraph)
n <- 10
adjm <- matrix(sample(0:100, n*10), nc=n)
colnames(adjm) <- rownames(adjm) <- letters[1:n]
g <- graph.adjacency(adjm, weighted=TRUE)
Лучшие три исходящих края для x
на основе свойства ребра (здесь веса) на входной матрице смежности:
x <- 'e'
adjm[x,][order(adjm[x,], decreasing = TRUE)][1:3]
Выход:
i a b
86 62 40
Текущий подход довольно громоздок: выделите соседей и ребра соседям, добавьте к кадру данных, отсортируйте кадр и выберите первые три:
x <- 'e'
tab <- data.frame(cbind(
name=V(g)[neighbors(g,x, mode='out')]$name,
weight=E(g)[x %->% neighbors(g,x, mode='out')]$weight)) # or %--%, %<-%
tab <- tab[order(tab$weight, decreasing=TRUE),]
head(tab,3)
Выход:
name weight
8 i 86
1 a 62
3 c 6
Есть ли более элегантный подход?
1 ответ
Я не знаю, элегантно ли это, но, конечно, короче:
e_edges <- E(g)[from(x)]
e_top_weights <- order(e_edges$weight, decreasing=TRUE)[1:3]
E(g)[ as.vector(e_edges)[e_top_weights] ]
Последовательность кромок:
#> [48] e -> i
#> [41] e -> a
#> [42] e -> b
Последний шаг громоздок, потому что e_edges
для него определен странный оператор индексирования, и вам нужно преобразовать его в вектор. Это изменится в следующей версии igraph, и вы сможете написать естественный
e_edges[e_top_weights]
Пожалуйста, скажите мне, если у вас есть вопросы.