Создание списка смежности из data.frame - PullRequest
6 голосов
/ 12 июля 2009

У меня есть data.frame с 2 столбцами: Узел A, Узел B. Каждая запись в кадре подразумевает ребро в графе между узлами A и B.

Должна быть хорошая однострочная строка для преобразования этого data.frame в список смежности. Есть намеки?

Ответы [ 4 ]

11 голосов
/ 01 декабря 2011

Поскольку вы отметили это , как насчет использования встроенных функций?

> g <- graph.data.frame( edges )
> adjlist <- get.adjedgelist(g)

Единственное предостережение - вершины с нулевым индексом, которые будут меняться с помощью igraph 0.6.

6 голосов
/ 12 июля 2009

Быстро и грязно ...

> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5))

> adjlist <- by(edges, edges$nodea, function(x) x$nodeb)

> for (i in as.character(unique(edges$nodea))) {
+   cat(i, ' -> ', adjlist[[i]], '\n')
+ }

1  ->  1 5
2  ->  2 4
4  ->  3

> adjlist
edges$nodea: 1
[1] 1 5
------------------------------------------------------------
edges$nodea: 2
[1] 2 4
------------------------------------------------------------
edges$nodea: 4
[1] 3
4 голосов
/ 12 июля 2009
> edges <- data.frame(nodea=c(1,2,4,2,1), nodeb=c(1,2,3,4,5))

> attach(edges)

> tapply(nodeb,nodea,unique)

$`1`
[1] 1 5

$`2`
[1] 2 4

$`4`
[1] 3
0 голосов
/ 12 июля 2009

как бы вы представляли список смежности в R? ему нужны списки переменного размера для множества смежных узлов; тогда вы должны использовать список (); но тогда что хорошего в R?

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

> edgelist=data.frame(A=c(1,1,2,2,2),B=c(1,2,2,3,4))
> library(plyr)
> llply(1:max(edgelist), function(a) list(node=a, adjacents=as.list(edgelist$B[edgelist$A==a])))
[[1]]
[[1]]$node
[1] 1

[[1]]$adjacents
[[1]]$adjacents[[1]]
[1] 1

[[1]]$adjacents[[2]]
[1] 2



[[2]]
[[2]]$node
[1] 2

[[2]]$adjacents
[[2]]$adjacents[[1]]
[1] 2

[[2]]$adjacents[[2]]
[1] 3

[[2]]$adjacents[[3]]
[1] 4



[[3]]
[[3]]$node
[1] 3

[[3]]$adjacents
list()


[[4]]
[[4]]$node
[1] 4

[[4]]$adjacents
list()
...