和父母一起在R做一棵树

时间:2016-11-17 03:31:24

标签: r tree

我正在尝试在R中创建一个树并计算2个节点之间的距离。

制作树的数据框如下:

tree.source <- data.frame(ID = 1:10, parentID = c(NA,1,1,1,2,2,2,3,4,4))
#ID parentID  
#1    NA  
#2     1  
#3     1  
#4     1  
#5     2  
#6     2  
#7     2   
#8     3  
#9     4  
#10    4

希望创建一个像这样的树结构

enter image description here

另外,我还想获得2个节点之间的距离。例如,节点5和10之间的距离在此为4到5-2-1-4-10。有4条边连接它们。节点2和8之间的距离为3,通过2-1-3-8。

可以使用带有每个节点路径的data.tree包来构建树,例如,节点10的PathString应该是1/4/10,但是{{1}当级别数增加时,可能会很长。有没有更好的方法来构建树?

2 个答案:

答案 0 :(得分:3)

可以使用以下方法生成树:

tree <- as.Node(tree.source[-1,],mode = "network")

as.Node函数可以生成一个带有网络的树,其中第一列为“from”,第二列为“to”,后面的列为属性。

distance(g, 2, 8)可以给出节点2和8之间的距离。

答案 1 :(得分:2)

尝试这个(使用您给定的tree.source):

library(igraph)
g <- graph.data.frame(tree.source[-1,2:1], directed = FALSE)
plot(g)

enter image description here

# do a bfs with root as source, you will get distance of each vertex from root
bfs(g, root=1, "out", dist=TRUE)$dist
# 1  2  3  4  5  6  7  8  9 10 
# 0  1  1  1  2  2  2  2  2  2 

# shortest path from 5 to 10
sp <- unlist(shortest_paths(g, 5, 10, mode="out")$vpath)
sp 
# 5  2  1  4 10 
# 5  2  1  4 10 

# distance from 5 to 10 = # vertices on the path - 1
length(sp)-1
# [1] 4

# shortest paths from source node 5 to all
sp_from_5 <- shortest_paths(g, 5, mode="out")$vpath
names(sp_from_5) <- names(V(g))
sp_from_5

# output
$`1`
+ 3/10 vertices, named:
[1] 5 2 1

$`2`
+ 2/10 vertices, named:
[1] 5 2

$`3`
+ 4/10 vertices, named:
[1] 5 2 1 3

$`4`
+ 4/10 vertices, named:
[1] 5 2 1 4

$`5`
+ 1/10 vertex, named:
[1] 5

$`6`
+ 3/10 vertices, named:
[1] 5 2 6

$`7`
+ 3/10 vertices, named:
[1] 5 2 7

$`8`
+ 5/10 vertices, named:
[1] 5 2 1 3 8

$`9`
+ 5/10 vertices, named:
[1] 5 2 1 4 9

$`10`
+ 5/10 vertices, named:
[1] 5  2  1  4  10