2013-10-27 77 views
2

我想增加igraph图的邻接矩阵。我尝试没有成功执行以下操作:在igraph图中批量修改边缘

require(igraph) 
require(Matrix) 
set.seed(123) # to get always the same graph (see "R reproducible example") 
G <- igraph::erdos.renyi.game(20,10,type="gnm") 
mat <- Matrix(1:16, ncol=4,nrow=4) 
G[1:4, 1:4] <- mat 
# Error in `[<-.igraph`(`*tmp*`, 1:4, 1:4, value = <S4 object of class "dgeMatrix">) : 
# New value should be NULL, numeric or logical 

也试过: G [1:4,1:4] < - as.numeric(垫)

# Error in `[<-.igraph`(`*tmp*`, 1:4, 1:4, value = c(1, 2, 3, 4, 5, 6, 7, : 
# Logical or numeric value must be of length 1 

我知道有关add.edges()功能,但它似乎不会取代边缘,而是附加重量?如果我错了,请纠正我的错误。

我是R的新手,所以请尽可能详细。

由于

+0

我不确定你在这里做什么? “替代边缘”是什么意思?如果要删除顶点1:4中的边,并添加矩阵中的边,那么只需使用'delete.edges()'和'add.edges()。 –

+0

通过'替换边缘'我实际上意味着使用新的权重去除和替换边缘权重,只需要一个更有效的步骤。当我说高效时,我的意思是只更新需要它的位置上的节点的索引,而不是全部删除,然后将全部添加到我想要的子矩阵中。我猜这可能是缓慢的,因为节点索引必须更新两次,以获得子矩阵中的所有节点? – quine

+0

如果边缘已经全部存在,那么只需更新它们的权重。这可以用'G [from = ...,to = ...] < - newweigths'完成。您不能在一个步骤中添加边和更新其他边的权重。无法在单个步骤中删除边和边。顺便说一句。添加权重不会改变内部的图形索引,但是在R中,它会复制整个图形一次。 –

回答

1

分配G[] <-只需要一个逻辑值作为文档中所述(即TRUEFALSE)。
(类型:

?`[<-.igraph` 

,并检查节 “索引运营商”)

因此,举例来说,如果你用这种方式创建一个图表:

require(igraph) 
set.seed(144) # just to get the same initial graph 
G <- igraph::erdos.renyi.game(10,5,type="gnm") 

plot.igraph(G,layout=layout.kamada.kawai) 

Initial Graph

那么你这样做:

G[1:4,1:4] 
> 
[1,] . . . . 
[2,] . . 1 . 
[3,] . 1 . . 
[4,] . . . . 

你得到的(0,1),一个4x4稀疏矩阵,其中1(i,j)位置表明,有一个从ij边缘。
正如你所看到的,在这种情况下,只有一个边缘2,3(显然3,2,因为是一个无向图)

然后,通过设置G[1:4,1:4] <- TRUE你这是在强迫边缘的所有顶点之间(1,4),相反,通过设置G[1:4,1:4] <- FALSE您正在删除(1,4)中所有顶点之间的所有边。因此,这些方法不太适合选择性地“批量改变”邻接矩阵,因为您只能创建或删除矩阵子集中的所有边。

在我看来,更好的方法可能是将这种方法与add.edges相结合;例如,如果您想更改(1,4) adj。子矩阵连接(1,3)(2,4),你可以这样做:

G[1:4,1:4] <- FALSE # remove previous edges 
G <- add.edges(G, c(1,3,2,4)) # add the new edges 

事实上,再次密谋:

plot.igraph(G,layout=layout.kamada.kawai) 

你会得到这样的:

Modified Graph

在那里你可以看到该边缘(2,3)已被淘汰,新边缘(1,3)(2,4)已被添加。

+0

看来你是对的。这是做我所需要的最有效的方法。谢谢! – quine