【问题标题】:count max levels of a tree below each node in r计算 r 中每个节点下方的树的最大级别
【发布时间】:2018-01-07 02:52:24
【问题描述】:

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

【问题讨论】:

  • 你能描述一下从输入到输出的逻辑吗?我不明白你是如何得到“A 3,B 0”等的。
  • 如果你画出树,它是每个节点下面的最大层数。 B、E、F、H,我都有 0 个其他节点指向它们。对于 A,它有 3 个孩子,从 A->D->G->H 的路径最长,所以它有 3 个。其他的将是 A->E; A->C->我;和 A->D->F。
  • 看来,当您说从 A 到 Z 时,您将其解释为比 Z 低一级的 A。这样对吗?
  • 是的,没错。
  • 这可能是沿着这条线的东西,但它只计算指向特定节点的节点数,而不是每个节点下面的级别数。

标签: r tree hierarchy


【解决方案1】:

使用数据树:

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多