从数据框创建邻接列表

6

我有一个数据框,包含两列:节点A和节点B。框架中的每个条目都意味着节点A和B之间的图边缘。

是否有一种简洁明了的方法将此数据框转换为邻接表?有什么提示吗?

4个回答

12

由于您打了标签 ,为什么不考虑使用内置功能呢?

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

唯一需要注意的是,顶点索引是从零开始的,在 igraph 0.6 中会发生改变。


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

咕。是的。这是一个完美的一行代码。奇怪的是,我的for循环解决方案运行速度是by()的两倍。 - Josh Reich
当你的表格有50000个数据(包含约5000个标识符)时,查询速度并不是很快。是否有更快的替代方案? - Yannick Wurm

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

由于R内部某些奇怪的原因,tapply(as.character(nodeb),as.character(nodea),unique)在将我的非常长的表格(10万行)转换为列表时比tapply(nodeb,nodea,unique)快上数百倍!!! - Yannick Wurm

0

你如何在R中表示邻接表?它需要变量大小的相邻节点集合,所以你必须使用list();但是把它放在R中有什么好处呢?

我可以想到一些类似于sapply函数的巧妙技巧,但它们对每个节点进行线性扫描。但是玩了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()

Brendan - 从igraph的角度来看,标准的方式是将点表示为一个顶点列表,每个列表元素都是相邻顶点的向量。 - Josh Reich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接