问题R: tree with overlapping strings我要求制作一棵看起来像的树
V621 --> V62123 --> V6212355
--> V621335 --> V62133526
--> V6216 --> V62162
--> V621213452
--> V62126324
它适用于包minimum spanning tree
中的igraph
,但现在我想确定该树的每个元素的深度。我怎么这么做?
答案 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)))