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

Есть ли более элегантный подход?


person mhermans    schedule 19.03.2015    source источник


Ответы (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]

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

person Gabor Csardi    schedule 20.03.2015
comment
Спасибо, я добавил убывающую опцию, чтобы получить тройку лидеров. Однако теперь, когда решения выровнены и воспроизводимы с помощью seed (), я заметил, что мое решение не только менее элегантно, но и возвращает неправильное решение (ребра узлов [i, a, c] вместо [i, a, b] ). Однако я не сразу вижу причину такого несоответствия. - person mhermans; 21.03.2015