R:深度最小生成树

时间:2014-10-09 14:43:46

标签: r tree depth

问题R: tree with overlapping strings我要求制作一棵看起来像的树

V621   --> V62123  --> V6212355
    --> V621335 --> V62133526
    --> V6216 --> V62162
    --> V621213452
    --> V62126324

它适用于包minimum spanning tree中的igraph,但现在我想确定该树的每个元素的深度。我怎么这么做?

1 个答案:

答案 0 :(得分:3)

如果我们借用previous answer ...

中的所有相关代码
df <- read.table(text='verkoop          V621  
verkoopcode      V62123  
verkoopcodenaam  V6212355  
verkoopdatum     V621335  
verkoopdatumchar V62133526  
verkooppr        V6216  
verkoopprijs     V62162  
verkoopsafdeling V621213452  
verkoopsartikel  V62126324')
# use igraph package
require(igraph)
# create adjacency matrix 
adj <- nchar(sapply(df$V1, gsub, x=df$V1, replacement=''))
adj[!sapply(df$V1, grepl, x=df$V1)] <- 0
# name adjecency matrix 
colnames(adj) <- df$V2
# original graph
gr <- graph.adjacency(adj, mode='directed', weighted=TRUE)
layout(matrix(1:2, ncol=2))
plot(gr)
# minimum spanning tree 
mst <- minimum.spanning.tree(gr)

你可以用

获得深度
shortest.paths(mst, to="V621", weights=rep(1, ecount(mst)))
#            V621
# V621          0
# V62123        1
# V6212355      2
# V621335       1
# V62133526     2
# V6216         1
# V62162        2
# V621213452    1
# V62126324     1

请注意,我们必须调整权重,因为默认情况下graph.adjacency使用adj中的值作为边的权重,实际上我们只想将每个边计为一个。你也可以做到

gr <- graph.adjacency(adj>0, mode='directed', weighted=TRUE)
mst <- minimum.spanning.tree(gr)
shortest.paths(mst, to="V621")

将所有默认权重设置为1。

这假设你知道&#34; V621&#34;是根节点。如果你不知道哪个是根节点,你可以用

找到它
dx <-degree(mst, mode="out")
root <- names(dx)[dx==0]
shortest.paths(mst, to=root, weights=rep(1, ecount(mst)))
相关问题