Как создать двудольную сеть в R с помощью igraph или tnet

У меня есть список краев для сети с двумя режимами, подобный этому:

person  Event
Amy     football_game
Sam     picnic
Bob     art_show

Я хочу провести анализ этого в R, но, похоже, все, что я пытаюсь, терпит неудачу. Преобразование его в однорежимную сеть приводит к ограничению памяти, и я не могу понять, как анализировать его как двудольный в igraph или tnet.

В игре 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"

1 ответ

Решение

В 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" - количество ребер.

Другие вопросы по тегам