Сортировка и подмножество соседей по свойству ребра в 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]

Пожалуйста, скажите мне, если у вас есть вопросы.

Другие вопросы по тегам