2014-09-03 1 views
1

У меня есть список графиков (формат igraph), и я бы хотел получить граф слияния, который был бы пересечением тех узлов и вершин, которые разделены определенным процентом через все графики.пересекают графики, разделяющие процент ребер и вершин

Я знаю, что библиотека igraph имеет функцию graph.intersection(), но эта функция пересекает все вершины и узлы, присутствующие на всех графиках.

Любая помощь будет высоко ценится

Вот краткий пример

g1 <- graph.data.frame(df1, directed=F) 
df2 <- data.frame(V1=c(1,2,2,3,4), V2=c(3,3,5,5,5)) 
g2 <- graph.data.frame(df2, directed=F) 
df3 <- data.frame(V1=c(1,2,3,4), V2=c(3,3,5,5)) 
g3 <- graph.data.frame(df3, directed=F) 
df4 <- data.frame(V1=c(1,1,2,3), V2=c(2,3,4,5)) 
g4 <- graph.data.frame(df4, directed=F) 

get.edgelist(g1) 
    [,1] [,2] 
[1,] "1" "3" 
[2,] "2" "3" 
[3,] "2" "4" 
[4,] "3" "5" 
[5,] "4" "5" 

get.edgelist(g2) 
    [,1] [,2] 
[1,] "1" "3" 
[2,] "2" "3" 
[3,] "2" "5" 
[4,] "3" "5" 
[5,] "4" "5" 

get.edgelist(g3) 
    [,1] [,2] 
[1,] "1" "3" 
[2,] "2" "3" 
[3,] "3" "5" 
[4,] "4" "5" 

get.edgelist(g4) 
    [,1] [,2] 
[1,] "1" "2" 
[2,] "1" "3" 
[3,] "2" "4" 
[4,] "3" "5" 

Если я ставлю все графы в списке:

mylist <- list(g1,g2,g3,g4) 

, а затем применить функцию graph.intersection():

g.int <- graph.intersection(mylist, keep.all.vertices=FALSE) 

В результате график со следующими узлами и ребрами:

V(g.int) 
[1] "1" "2" "3" "4" "5" 

get.edgelist(g.int) 
    [,1] [,2] 
[1,] "3" "5" 
[2,] "1" "3" 

То, что я хочу, чтобы включить эти вершины и ребра, которые появляются в определенный процент, в этом примере я хотел бы включить края, присутствующие в 75 % графиков. Таким образом, оптимальный результат будет:

V(g.int) 
[1] "1" "2" "3" "4" "5" 

get.edgelist(g.int) 
    [,1] [,2] 
[1,] "3" "5" 
[2,] "1" "3" 
[3,] "4" "5" 

Надежда теперь более ясно

+0

Как написано, этот вопрос очень широк и трудно ответить в общем случае. Укажите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Включите некоторые примеры данных, а также желаемый результат. Это сделало бы ваш вопрос намного легче ответить. – MrFlick

+0

Вы пытались добавить матрицы смежности? –

+0

Не @WillBeason, может быть, я должен дать ему попробовать – user2380782

ответ

1

Вы можете создать график всех ребер графов, а затем устранить края, которые не появляются достаточно часто.

library(igraph) 

# generate graphs 
edgeset <- combn(1:20, 2) 

graphs <- list() 
for (i in 1:10) { 
    graphs[[i]] <- graph(i + edgeset[, sample(ncol(edgeset), 150)]) 
} 

# Get a list of all edges in all graphs 
myedges <- lapply(graphs, get.edgelist) 

# Make a graph of all of the edges including overlap 
uniongraph <- graph(do.call(rbind, myedges)) 

# Eliminate edges not overlapped enough 
resultgraph <- graph.adjacency(get.adjacency(uniongraph) >= 0.75 * length(graphs)) 
+0

Ваш подход @WillBeason работает, когда графики имеют одинаковое количество вершин, но имеют ли графики разные числа вершин, матрицы смежности не могут быть уменьшены, правильно? – user2380782

+0

Просто добавьте узлы не в каждый граф к графикам и убедитесь, что все они отсортированы правильно. –

+0

Спасибо @WillBeason, я попробую ваше предложение – user2380782

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

  • Нет связанных вопросов^_^