我正在尝试使用line.graph将边缘转换为节点。我的第一个图表有每个边缘的权重,我试图通过以下方式在新图表上获得权重 -
第一张图 -
1 -------(0.7)----- ----- 2(0.5) - - - - 3
新图表 -
1,2- -------(0.35)-------- 2,3
因此,第一个图的顶点是1,2和3. 1-2的边缘权重是0.7,2-3的边缘权重是0.5。在新图中我有顶点(1,2)和(2,3),连接它们的边有0.35的权重,即边权重的乘积(0.7 * 0.5)。
我怎么能在igraph中做到这一点?
答案 0 :(得分:2)
基本上,我会将用于计算新图的算法总结为:
我将采用的方法是循环原始图中的节点,为与该节点相邻的每对边添加新图的边:
# Sample graph (from comments on original question)
library(igraph)
g <- graph.data.frame(data.frame(x=1:3, y=2:4, weight=c(0.7, 0.5, 0.2)))
# Build new graph from edge list
g.edges <- get.edges(g, E(g))
enames <- paste(g.edges[,1], g.edges[,2], sep=",")
ewts <- E(g)$weight
(new.edges <- do.call(rbind, sapply(1:vcount(g), function(x) {
incident <- which(g.edges[,1] == x | g.edges[,2] == x)
if (length(incident) <= 1) {
return(NULL)
} else {
all.comb <- combn(incident, 2)
return(data.frame(x=enames[all.comb[1,]], y=enames[all.comb[2,]], weight=apply(all.comb, 2, function(x) prod(ewts[x]))))
}
})))
# x y weight
# 1 1,2 2,3 0.35
# 2 2,3 3,4 0.10
您可以使用graph.data.frame(new.edges)
构建新图表。