如何在R中使用igraph或tnet创建一个二分网络

9

我有一个类似于以下结构的双模式网络的边列表:

person  Event
Amy     football_game
Sam     picnic
Bob     art_show

我希望在R中对此进行分析,但似乎我尝试的所有方法都失败了。将其转换为单模网络会遇到内存限制问题,并且我无法弄清楚如何在igraph或tnet中以二部图方式进行分析。
在igraph中,bipartite.projection给出了全部为FALSE的结果,而使用的igraph对象是:
net <- graph.edgelist(myobject)

在tnet上,我无法将igraph网络转换为tnet网络,并且当我尝试使用原始数据框时,会因图中的重复项而被拒绝。

因此,以下任何问题的答案都将非常感激:

  1. 如何使用bipartite.mapping函数?
  2. 如何将igraph对象输入tnet中?
  3. 如果所有其他方法都失败了,我该如何在tnet中输入具有重复边缘的数据框?

如果这些问题太基础,请见谅,因为很少有文档记录。

编辑

示例:

edgelist <- read.table(text="Person    Event
                             Amy       football
                             Bob       picnic
                             Sam       artshow", 
                       header=TRUE)
edgelist <- as.matrix(edgelist)

## Igraph Issues
igraph <- graph.edgelist(edgelist)
typevector <- bipartite.projection(igraph) 
# gets all FALSE

edgelist2 <- get.edgelist(igraph)
typevector <- bipartite.projection(edgelist2) 
# same thing

## tnet issues
tnet <- as.tnet(edgelist) 
# gives error: "There are duplicate events in the edgelist"
tnet <- as.tnet(edgelist2)
clusterMat <- clustering_local_tm(tnet)  
# gives error: "max not meaningful for factors"

onemode <- projecting_tm(tnet, method="Newman") 
# gives error: "arguments must have same length"

尽量发布一个可重现的例子。这将非常有帮助。我们不知道myobject是什么。 - Simon O'Hanlon
此外,如果有人有tnet的教程或示例,那就可以帮助很多人了。 - Olga Mu
@user1888451 Tore Opsahl(作者)在他的网站上演示了一些例子。http://toreopsahl.com/tnet/ - ndoogan
1个回答

20
在igraph中,双分图是一种具有type顶点属性的网络。该属性必须是逻辑型的,对于其中一种节点类型为TRUE,对于其他节点类型为FALSE。因此,要从您的边列表创建一个双分图网络,只需创建一个常规图,然后添加type顶点属性即可:
edgelist <- read.table(text="Person    Event
                         Amy       football
                         Bob       picnic
                         Sam       artshow", 
                   header=TRUE)
igraph <- graph.data.frame(edgelist)

V(igraph)$type <- V(igraph)$name %in% edgelist[,1]
igraph
# IGRAPH DN-B 6 3 -- 
# + attr: name (v/c), type (v/x)

'B'字母告诉你这是一个二分图。您可以通过以下方式创建此网络的单分投影:

bipartite.projection(igraph)
# $proj1
# IGRAPH UN-B 3 0 -- 
# + attr: name (v/c), type (v/x)
#
# $proj2
# IGRAPH UN-B 3 0 -- 
# + attr: name (v/c), type (v/x)

这将返回两个图的列表。如果您认为投影可能太大,可以先调用 bipartite.projection.size 函数,这将给出两个投影中顶点和边的数量。Igraph图的内存要求是(4m+2n)*8+O(1)字节,其中'n'是顶点数,'m'是边数。


@Gabor 我试图投影一个加权二分图,但是我遇到了错误“不允许负向量”,导致我的R会话崩溃...你以前遇到过这种情况吗? - user1317221_G
@user1317221_G:很可能你的图不是二分图,即你在同一类型的顶点之间有连接。 - Gabor Csardi
根据顶点类型设置顶点颜色,例如 V(g)$color <- V(g)$type + 1 - Gabor Csardi
一个igraph图的内存需求为(4m+2n)*8+O(1)字节。在这个方程中,O(1)是什么意思? - Zach
啊,我明白了。谢谢你。 - Zach
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接