计算 r 中每个节点下方树的最大层数

count max levels of a tree below each node in r

在 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 解决一些问题,但我似乎无法解决,也不确定其他哪些软件包在这里会有帮助。任何帮助将非常感激。

您可以使用 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))]

与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中添加排序变量。