从data.frame创建邻接列表

时间:2009-07-11 21:36:43

标签: r igraph

我有一个包含2列的data.frame:节点A,节点B.帧中的每个条目都意味着节点A和B之间的图形边缘。

必须有一个很好的单行将这个data.frame转换成邻接列表。任何提示?

4 个答案:

答案 0 :(得分:11)

由于您标记了此,如何使用内置功能?

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

唯一需要注意的是顶点是零索引的,随着igraph 0.6的变化而变化。

答案 1 :(得分:6)

又快又脏......

> 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

答案 2 :(得分:4)

> 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

答案 3 :(得分:0)

你怎么能代表R中的邻接名单?它需要相邻节点集的可变大小的列表;所以你必须使用list();但是它在R中有什么用呢?

我可以想到具有类似蓝宝石功能的蹩脚技巧,但他们会对每个节点进行线性扫描。但是玩了1分钟,这里是:一个pairlist列表,其中每对的第二项是邻接列表。输出比datstructure真的更疯狂。

> 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()