批量改变igraph图中的边

时间:2013-10-27 09:32:53

标签: r 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]&lt; - as.numeric(mat)

# 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的新手,所以可以随心所欲地表达自己的意思。

由于

1 个答案:

答案 0 :(得分: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,] . . . .

您获得了4x4 (0,1)的稀疏矩阵,其中位置1的{​​{1}}表示从(i,j)i的边缘。
如您所见,在这种情况下,只有一条边j(显然2,3因为是无向图)

然后,通过设置3,2,您强制G[1:4,1:4] <- TRUE中所有顶点之间的边缘,相反,通过设置(1,4),您将删除{{1}中所有顶点之间的所有边}}

因此,这些方法不太适合选择性地“批量改变”邻接矩阵,因为你只能创建或删除矩阵子集中的所有边。

在我看来,更好的方法是将这种方法与G[1:4,1:4] <- FALSE结合起来;例如,如果要更改(1,4) adj。要连接add.edges(1,4)的子矩阵,您可以这样做:

(1,3)

事实上,再次密谋:

(2,4)

你会得到这个:

Modified Graph

您可以看到边缘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) (2,3)