4

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

有没有更优雅的方法?

4

1 回答 1

4

我不知道这是否优雅,但肯定更短:

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]

如果您有任何问题,请告诉我。

于 2015-03-20T13:47:35.123 回答