2015-01-06 2 views
1

Что мне интересно, возможно ли создать перекрывающиеся сообщества в igraph?Как создать перекрывающиеся сообщества в igraph?

df1: вершина списка, и его членство

EDIT: идентификатор ссылаться на имя вершины и членство относятся к вершинной Идентификатор сообщества, поэтому вершина 1 является принадлежат двум общинам: 3 и 2

df1<- structure(list(id = c(1L,2L,3L, 4L, 5L,6L, 7L, 8L,9L), membership = list(c(3, 2),c(2),c(1),c(4), 
                      c(4, 1),c(2, 4), 
                      c(1),c(1, 3),c(2,1,3))), 
                  .Names = c("id","membership"),class = "data.frame", row.names = c(NA, -9L)) 
#id membership 
#1 1  3, 2 
#2 2   2 
#3 3   1 
#4 4   4 
#5 5  4, 1 
#6 6  2, 4 
#7 7   1 
#8 8  1, 3 
#9 9 2, 1, 3 

df2: edgelist с членством края

df2<- structure(list(id1 = c(1L,2L,5L,8L,9L,4L,6L),id2 = c(3L,5L,8L,1L,2L,3L,7L), membership = list(c(1),c(2),c(1,4),c(3,2), 
                      c(1,3, 4),c(3),c(1,2))), 
      .Names = c("id1","id2","membership"),class = "data.frame", row.names = c(NA, -7L)) 
    #id1 id2 membership 
#1 1 3   1 
#2 2 5   2 
#3 5 8  1, 4 
#4 8 1  3, 2 
#5 9 2 1, 3, 4 
#6 4 3   3 
#7 6 7  1, 2 

пожалуйста, считают, что мы хотим создать сообщество объект:

# diffrent membership vector from df1 
mem <-sapply(1:max(sapply(df1$membership, function(x)length(x))),function(y){ 
    unlist(lapply(df1$membership,function(x) x[y]))}) 

     # [,1] [,2] [,3] 
# [1,] 3 2 NA 
# [2,] 2 NA NA 
# [3,] 1 NA NA 
# [4,] 4 NA NA 
# [5,] 4 1 NA 
# [6,] 2 4 NA 
# [7,] 1 NA NA 
# [8,] 1 3 NA 
# [9,] 2 1 3 

#create community objects for each membership vector 
com<-sapply(1:ncol(mem),function(x) create.communities(membership=mem[,x], algorithm = NULL, merges = NULL, 
         modularity = NULL)) 

# com 
#[[1]] 
#Graph community structure calculated with the unknown algorithm 
#Number of communities: 4 
#Membership vector: 
#[1] 3 2 1 4 4 2 1 1 2 

# [[2]] 
#Graph community structure calculated with the unknown algorithm 
#Number of communities: NA 
#Membership vector: 
#[1] 2 NA NA NA 1 4 NA 3 1 

#[[3]] 
#Graph community structure calculated with the unknown algorithm 
#Number of communities: NA 
#Membership vector: 
#[1] NA NA NA NA NA NA NA NA 3 

    **Edit**:graph=graph.data.frame(df2,directed=FALSE) 
    sapply (1:length(com),function(x) plot.communities(com[[x]],graph)) 

, что последняя строка дает мне ошибку Error in membership(x) : Cannot calculate community membership, поскольку она не может вычислить количество общин с НС включен в состав сообщества

Итак, что было бы решением для создания этих перекрывающихся сообществ в igraph? Спасибо заранее и извините за мой длинный вопрос.

+1

Это не поддерживается в igraph AFAIK. 'create.communities' не работает для перекрывающихся сообществ. –

+0

спасибо за комментарий @GaborCsardi, есть ли другой способ иметь перекрывающиеся сообщества? –

+0

Я не уверен, что вы пытаетесь сделать здесь, но вы можете определить свой собственный класс для своих сообществ. Например. просто поместите в список разные группы. –

ответ

1
  1. Непонятно, к каким именам столбцов относятся df1.
  2. Не похоже, что вы используете df2. Почему вы это определяете?
  3. Я получаю сообщение об ошибке, когда он достигает функции plot.communities. Это личная функция?
  4. Я не вижу переменную в любом месте кода, так что это приведет к ошибке.

В любом случае, при создании mem, сначала с использованием первого значения df1$membership, а затем второго и т.д. Для некоторых (столбцов 2-4, 7), есть только один элемент membership , поэтому он возвращает NA. Возможно, вам придется явно проверить длину элемента.

Так что-то похожее на это может быть то, что вы хотите (но заменить условие ifelse, если вы должны):

мем < - sapply (1: макс (sapply (df1 $ членство, длина)) , функция (у)

sapply (членство df1 $, функция (х)

IfElse (длина (х) < у, х [1], х [у])))

> MEM

[,1] [,2] [,3] 

[1,] 3 2 3

[2,] 2 2 2

[3,] 1 1 1

[ 4,] 4 4 4

[5,] 4 1 4

[6,] 2 4 2

[7,] 1 1 1

[8,] 1 3 1

[9,] 2 1 3

Я также немного изменил код (например, избавился от unlist(lapply).

EDIT: Кроме того, при создании com, вы, вероятно, хотите lapply вместо sapply.

+0

Спасибо за ваш ответ, см. Часть редактирования при определении 'graph' (' df2': это список краев) и 'df1' colnames. 'plot.communities' не является личной функцией: см. это [link] (http://igraph.org/r/doc/communities.html) –

+0

, который каким-то образом рассмотрит решение, но предположим, что из первых есть некоторые вершины, которые не принадлежат ни одному сообществу. –

Смежные вопросы