2012-04-17 3 views
1

У меня есть вектор имен и таблица расстоянийсоздания объекта graphNEL из данных

Nodes:

>V 
SERPINA3 
ABAT18 
ABL1 
ACADM 

Edges:

>distances 
SERPINA3 1 179 713 627 1937 5984 747 1450 681 718 749 1124 1839 1617 1639 2017 3619 5985 5986             
ABL1 3 175 12 77 81 179 144 174 208 213 223 270 274 282 305 331 348 459 532 517 785 710 889 5988 972 1120 1064 1592 1322 1324 1331 1373 1526 1566 1717 1718 1802 1847 1947 
ABAT18 2 5987            
ACADM 4 5998 

Из этих двух файлов, которые я хотел бы создайте объект graphNEL с помощью этой команды:

gR <- new("graphNEL", nodes=V, edgeL=edL1) 

Есть ли у кого-нибудь идеи относительно того, как это должно быть сделано. Я как-то не могу получить список расстояний в список списков, чтобы соответствовать модели edgL.

После запуска этого commad:

edL1 <- vector("list", length=ncol(Dist1)) 
names(edL1) <- V 
for(i in 1:ncol(Dist1)) 
edL1[[i]] <- list(edges=Dist1[,i], weights=sqrt(i)) 
gR <- new("graphNEL", nodes=V, edgeL=edL1) 

Я получаю эту ошибку:

NA element in edges.

The graph is undirected and the following edges are not reciprocated: NA|SERPINA3, NA|ABAT18, NA|ABL1, NA|ACADM

Error in validObject(.Object) : invalid class “graphNEL” object: FALSE

Но нет NAs в данных. Есть ли у кого-нибудь идеи?

Благодаря Асса

+0

каждый узел в списке - это список, в котором '$ edge' в списке является вектором индексов узлов, а не имен узлов и' $ weight' является вектором той же длины с весами (этот, я думаю, вы правильно). –

ответ

1

я натыкался подобной ошибки в попытке создать объект graphNEL. Моя проблема заключалась в том, что элементы списка ребер должны быть индексы узлов - так пример edgeL может выглядеть

$SERPINA3 
$SERPINA3$edges 
[1] 1, 2, 4 

против того, что можно было бы первоначально ожидать (следующее неправильно):

$SERPINA3 
$SERPINA3$edges 
[1] 'SERPINA3', 'ABL1', 'ACADM' 

Я не совсем понимаю, как элементы edgeL отображают узлы, созданные вами в V (т. Е. Как числа 1, 2, 3, 4 или 179, 175, 5987, 5998 относятся к элементам V?), поэтому я не могу предоставить ответ, специфичный для ваших данных, но использование индексов, в отличие от имен узлов, решило мою проблему.

EDIT:

Я столкнулся с конкретной проблемой вы описываете и нашел link, который дал полезный совет. Сначала создайте ориентированный граф и используйте функцию ugraph, чтобы получить «базовый» неориентированный граф, который представлен вашим ориентированным графом.

1

Я боролся с этим сам на некоторое время. documentation не очень ясен. В конце концов я нашел ответ в документации Rgraphviz package.

Вы можете инициализировать граф без назначения края:

gR = new("graphNEL", nodes = V, edgemode = "directed") 

Затем вы можете добавить кромками один за другим с помощью:

gR = addEdge("SERPINA3", "ABAT18", gR, 5987) 

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

+0

Это работает, но это очень медленное решение. Если вы на самом деле определяете список ребер заранее, это намного быстрее ... –

1

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

From <- c("A","A","C","C") 

To <- c("B","C","B","D") 

L <- cbind(From,To) 

mygraphNEL <- ftM2adjM(L, edgemode="directed") 

Подробнее here.

+0

Можете ли вы [изменить] исправление форматирования кода? –

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