R 和父母一起做一棵树

R 和父母一起做一棵树,r,tree,R,Tree,我试着在R中做一棵树,计算两个节点之间的距离 生成树的数据框如下所示: 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 tree.source可以

我试着在R中做一棵树,计算两个节点之间的距离

生成树的数据框如下所示:

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

tree.source可以使用以下方法生成树:

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

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

tree <- as.Node(tree.source[-1,],mode = "network")
tree试试这个(使用给定的tree.source):

库(igraph)
g试试这个(使用给定的tree.source):

库(igraph)

g交替的是
igraph
包。要读入并创建图形,请使用
g=graph\u from\u data\u frame(na.omit(tree.source[2:1]);绘图(g,布局=布局作为树)
。然后有一些函数可以找到简单的或最短的路径。这些函数类似于
get.shortest.paths(g,2,8,mode=“all”)
,它会按预期返回
2/1/3/8
。@user20650,很有效,谢谢!而且还显示了一个更好的情节。也谢谢你的编辑@最近的邮件,谢谢!检查帮助文件后,
distance(g,2,8)
可以直接给出距离。另一种方法是
igraph
包。要读入并创建图形,请使用
g=graph\u from\u data\u frame(na.omit(tree.source[2:1]);绘图(g,布局=布局作为树)
。然后有一些函数可以找到简单的或最短的路径。这些函数类似于
get.shortest.paths(g,2,8,mode=“all”)
,它会按预期返回
2/1/3/8
。@user20650,很有效,谢谢!而且还显示了一个更好的情节。也谢谢你的编辑@最近的邮件,谢谢!检查帮助文件后,
distance(g,2,8)
可以直接给出距离。
# 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