создание двудольного графа в R с помощью igraph с определенным списком ребер

Я новичок в R, а также igraph. Я хочу сделать двудольный граф между двумя наборами узлов (у одного 2115 узлов, а у другого 4) с указанным списком ребер. Это звучит просто, но у меня много трудностей с его созданием, и пока нет результата. Буду признателен за любую помощь. Вот мой кусок кодов:

library(igraph)
test <- graph.data.frame(file.choose(), directed=T)
edge <- read.table(text="e1 e2
779 958
779 1293
779 1503
1124 97
1124 151
2078 979
1970 344", header=T)
edgels <- graph.edgelist(as.matrix(edge))
g <- graph.bipartite(test, edgels, directed=T)

Я не знаю, где мой код неверен, и я думаю, это все потому, что я новичок в этом. Большое спасибо за вашу помощь.


person tolou    schedule 05.03.2015    source источник
comment
Как выглядит тест (используйте head) и какие ошибки вы получаете?   -  person Math    schedule 05.03.2015


Ответы (1)


Вот пример того, как вы можете построить двудольный граф:

library(igraph)

#### create example input data
nodesSet1 <- 1:3
nodesSet2 <- 1:5
edgeList <- data.frame(S1=c(1,1,2,3,3,3),
                       S2=c(1,3,5,3,4,2))
####

### PREMISE :
### graph.bipartite function simply create a graph and add a boolean 'type' attribute
### to each vertex that indicate the partition of the vertex (e.g. TRUE first partition, 
### FALSE second partition).
### So, it's not strictly necessary to use that function to get a bipartite graph, but 
### you can use any method you like (or feel easier) as long as you add a 'type' 
### attribute. 
### Hence, in the following code I won't use graph.bipartite since I don't like it :)


# first we give prefixes to the nodes to discern the two partition
g <- graph.empty()
g <- add.vertices(g,nv=length(nodesSet1),attr=list(name=paste0('A',nodesSet1),
                                          type=rep(TRUE,length(nodesSet1))))
g <- add.vertices(g,nv=length(nodesSet2),attr=list(name=paste0('B',nodesSet2),
                                type=rep(FALSE,length(nodesSet2))))

# we need to turn edgeList into a vector (and using names instead of indexes)
edgeListVec <- as.vector(t(as.matrix(data.frame(S1=paste0('A',edgeList$S1),
                             S2=paste0('B',edgeList$S2)))))
g <- add.edges(g,edgeListVec)

# check if is recognized as bipartite
is.bipartite(g)

# let's plot it !
plot.igraph(g, layout=layout.bipartite,
               vertex.color=c("orange","green")[V(g)$type+1])

введите здесь описание изображения

person digEmAll    schedule 05.03.2015
comment
Привет, digEmAll, спасибо за быстрый ответ. Но в моем случае это не работает. основная проблема здесь в том, что в одном наборе узлов у меня 2115 узлов, поэтому я не могу указать его, как вы. Я хочу быть более ясным, я использую подготовленный набор сетевых данных и пытаюсь сделать двудольный граф на его основе и указанных узлов в его наборе узлов. Поэтому у меня есть список ребер, в котором указано, какой узел подключен к какому в другом наборе узлов. Так что то, что вы предлагаете, здесь не совсем уместно. У вас есть еще предложения? Заранее спасибо. - person tolou; 05.03.2015
comment
Ммм, я не уверен, что правильно вас понял... у вас есть один большой список ребер (например, A -> X, A -> X, B -> Y ...) и ОДИН набор узлов, представляющий только узлы в одном разделе (например, A,B, ....), и вы хотите вывести второй набор узлов, построив двудольный граф... это правильно? Пожалуйста, поправьте меня, если я ошибаюсь, в конце концов разместив небольшой пример вашего ввода и желаемого результата... - person digEmAll; 05.03.2015
comment
Привет, digEmAll, мне наконец удалось решить эту проблему, как я уже говорил, я совершенно новичок в R и igraph. и мои трудности были из-за того, что я неправильно понял функцию graph.bipartite. Во всяком случае, теперь я понимаю, что все кончено. Большое спасибо за ваше время и беспокойство. - person tolou; 06.03.2015
comment
@tolou Не могли бы вы изложить свое решение в качестве ответа для будущих читателей, таких как я? Очень полезно видеть принятые ответы на вопросы. Спасибо - person Luca Pontiggia; 26.07.2019