使用 igraph 在 R 中按边 属性 对邻居进行排序和子集化
Sort and subset neighbors by edge property in R using igraph
在R中使用igraph
,对于某个节点x
,我想根据[=17之间的边的属性列出前三个相邻节点=]和那个相邻节点。
创建有向加权样本图:
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
当前的方法相当麻烦:select 邻居和边缘到邻居,添加到数据帧,对数据帧进行排序,然后 select 前三名:
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
有没有更优雅的方法?
我不知道这是否优雅,但肯定更短:
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]
有问题请告诉我
在R中使用igraph
,对于某个节点x
,我想根据[=17之间的边的属性列出前三个相邻节点=]和那个相邻节点。
创建有向加权样本图:
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
当前的方法相当麻烦:select 邻居和边缘到邻居,添加到数据帧,对数据帧进行排序,然后 select 前三名:
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
有没有更优雅的方法?
我不知道这是否优雅,但肯定更短:
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]
有问题请告诉我