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"
4

1 回答 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)

This will return a list of two graphs. If you think that the projection might be too big, you can first call the bipartite.projection.size function, this will give you the number of vertices and edges in both projections. The memory requirement for an igraph graph is (4m+2n)*8+O(1) bytes, where 'n' is the number of vertices and 'm' is the number of edges.

于 2013-03-13T18:08:34.430 回答