2016-12-31 14 views
1

Я пытаюсь добавить ребра к графу с циклом for. Цикл for добавляет ребра к графику на основе узлов в x и y. x - это вектор узлов, в котором несколько узлов в y необходимо сформировать кромку.Добавление краев в узлы в графе быстрее с помощью igraph в R

Я создал цикл вложенных циклов для прокрутки индексов списка и количества узлов в каждом индексе y, но он медленный. Я хотел бы ускорить это, так как граф может получить намного больше, чем только 6 узлов (~ тысяч). Я попытался использовать функцию apply (открыть другие быстрые предложения, если они есть), чтобы сделать это быстрее, но не удалось.

library(igraph) 

x = 1:6 

head(y) 
[[1]] 
[1] 3 

[[2]] 
[1] 2 6 

[[3]] 
[1] 3 4 

[[4]] 
[1] 5 3 

[[5]] 
[1] 4 6 5 3 

g = graph.empty(6, directed = FALSE) 

g 
IGRAPH U--- 6 0 -- 
+ edges: 

Что у меня есть это

for (m in 1:length(y)) {  
    for (j in 1:length(y[[m]])) { 
     g = add.edges(g, edges = c(x[m], y[[m]][j])) 
    } 
} 

g 
IGRAPH U--- 6 11 -- 
+ edges: 
[1] 1--3 2--2 2--6 3--3 3--4 4--5 3--4 4--5 5--6 
[10] 5--5 3--5 

EDIT Попытка устранить ошибку я получаю, используя предложенный код выглядит следующим образом:

set.seed(1) 
x=1:5 
x = as.numeric(x) 
y = vector(mode='list', length=5) 
y[[1]] = 3 
y[[2]] = c(2,6) 
y[[3]] = c(3,4) 
y[[4]] = c(5,3) 
y[[5]] = c(4,6,5,3) 
class(x); class(y) 
#[1] "numeric" 
#[1] "list" 
sum(is.na(x)) != 0 
#[1] FALSE 
length(x) == length(y) 
#[1] TRUE 
edges = stack(setNames(y, x[1:length(y)])) 
#Error in (function (classes, fdef, mtable) : 
#unable to find an inherited method for function ‘raster’ for signature ‘"numeric"’ 

edges = na.omit(as.data.frame(lapply(stack(setNames(y, x[1:length(y)])), function(col) as.numeric(as.character(col))))) 
#Error in as.data.frame(lapply(stack(setNames(y, x[1:length(y)])), function(col) as.numeric(as.character(col)))) : 
    #error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Error in (function (classes, fdef, mtable) : 
    #unable to find an inherited method for function ‘raster’ for signature ‘"numeric"’ 
+0

вы можете передать несколько ребер в add_edges, http://stackoverflow.com/questions/39800516/add-more-than-one- edge-based-on-edge-attributes-using-igraph/39862276 # 39862276 – user20650

+0

Возможно, вам захочется перезапустить сеанс R. Я не получаю сообщение об ошибке для обеих версий. – Psidom

ответ

0

Вы можете преобразовать список y и node x к кадру пограничных данных, а затем сразу вызовите graph.data.frame, чтобы построить график сразу, это позволяет избежать использования fo г петли и добавить кромками один за другим, который должен быть быстрее (непроверенные):

library(igraph) 
edges = na.omit(stack(setNames(y, x[1:length(y)]))) 
graph.data.frame(edges, directed = FALSE) 

IGRAPH UN-- 6 11 -- 
+ attr: name (v/c) 
+ edges (vertex names): 
[1] 3--1 2--2 2--6 3--3 3--4 4--5 3--4 4--5 6--5 5--5 3--5 
+0

Спасибо, я не знал о graph.data.frame. Я получаю предупреждение с вашим подходом, касающимся создания NA в файле graph.data.frame. Как вы с ними справились? 0 Предупреждение: 1: В файле graph.data.frame (edge, direct = FALSE): В элементах 'd '' NA были заменены строки «NA» 2: В '[<-. Factor' ('* tmp *', thisvar, value = "NA"): Недопустимый уровень фактора, NA сгенерированный – user3067923

+0

Хмм. Кажется, что ваш вектор x короче y. Возможно, вам нужно сначала проверить это. В идеале, если я правильно понимаю, x должен иметь ту же длину, что и y, это правильно? – Psidom

+0

Я пробовал с x той же длины, что и y, и получил то же предупреждение. Вы случайно не отменяете y? Если я перечислил y, я получаю предупреждение, о котором я упомянул: 'edge = stack (setNames (unlist (y), x [1: length (unlist (y))]))' Если я не перечислил y, я получаю эта ошибка _Error in (function (classes, fdef, mtable): не может найти унаследованный метод для функции 'растер' для подписи '' numeric '' _ – user3067923

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

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