计算r中每个节点下面的树的最大级别

时间:2018-01-07 02:52:25

标签: r tree hierarchy

在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来解决问题,但我似乎无法弄清楚,并且不确定其他软件包在这里会有什么帮助。任何帮助将非常感激。

2 个答案:

答案 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))]