Как создать двудольную сеть в 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, и когда я пытаюсь использовать исходный фрейм данных, он отказывается из-за дубликатов в графе.
Так что ответы на любой из следующих вопросов будут очень признательны:
- Как я могу использовать
bipartite.mapping
функционировать? - Как мне ввести объект igraph в tnet?
- Если ничего не помогает, как мне ввести фрейм данных с дублирующимися ребрами в 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" - количество ребер.