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