我正在尝试在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
希望创建一个像这样的树结构
另外,我还想获得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}当级别数增加时,可能会很长。有没有更好的方法来构建树?
答案 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)
# 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