在R中,我需要获得树中每个节点下面的层数。如果我的数据是:
from,to
A,Z
B,Z
C,A
D,A
E,A
F,D
G,D
H,G
I,C
结果应该是:
A 3
B 0
C 1
D 2
E 0
F 0
G 1
H 0
I 0
Z 4
我一直试图用data.tree
来解决问题,但我似乎无法弄清楚,并且不确定其他软件包在这里会有什么帮助。任何帮助将非常感激。
答案 0 :(得分:2)
使用data.tree:
EdgeList <- read.table(text="from to
A Z
B Z
C A
D A
E A
F D
G D
H G
I C",
header=TRUE)
library(data.tree)
dt <- FromDataFrameNetwork(EdgeList)
以树格式:
print(dt, lvls = function(node) node$height - 1)
这将打印如下:
levelName lvls
1 Z 4
2 ¦--A 3
3 ¦ ¦--C 1
4 ¦ ¦ °--I 0
5 ¦ ¦--D 2
6 ¦ ¦ ¦--F 0
7 ¦ ¦ °--G 1
8 ¦ ¦ °--H 0
9 ¦ °--E 0
10 °--B 0
或者使用您要求的格式
dt$Get("height") - 1
如果您需要按原始顺序排序,可以向EdgeList添加排序变量。
答案 1 :(得分:1)
您可以使用igraph
包来获取此信息。您可以将边缘列表转换为图形,然后计算节点之间的距离。你只想要最大值
距离。
## Your data
EdgeList = as.matrix(read.table(text="from to
A Z
B Z
C A
D A
E A
F D
G D
H G
I C",
header=TRUE))
## convert to an igraph graph
library(igraph)
g = graph_from_edgelist(EdgeList)
## Make a function to compute the height of a node
height = function(v) {
D = distances(g, to=v, mode="out")
max(D[D != Inf])
}
## Apply it to all nodes
sapply(V(g), height)
A Z B C D E F G H I
3 4 0 1 2 0 0 1 0 0
如果你真的想按字母顺序排列这些,你可以用
订购H = sapply(V(g), height)
H[order(names(H))]