根据父/子/兄弟关系从树中修剪/检索节点

问题描述 投票:0回答:2

我有一个树结构,具有唯一标识的节点、根和一堆分支。 任何节点可以发芽的分支数量或分支的深度没有限制。

我想做的是,给定一个节点的 id,有效地返回该节点的所有父节点的 id,以及每个父节点的所有兄弟节点的 id。 我希望这个特定问题的答案将使用专为此类操作设计的包/函数,以便我可以了解它们并将它们用于将来的类似问题,而不必每次都编写自定义算法。

这是子父形式的树:

structure(list(child = 1:20, parent = c(NA, 1L, 2L, 3L, 1L, 5L, 6L, 5L, 8L, 1L, 1L, 11L, 12L, 11L, 14L, 14L, 1L, 17L, 18L, 19L)), .Names = c("child", "parent"), class = "data.frame", row.names = c(NA, -20L))

这是一个视觉表示:

enter image description here

对于具体问题,我的目标 id 是 13(红色),并且希望获取父节点的 id(橙色)以及父节点的兄弟节点的 id(黄色)。 我绝对可以想出一个算法来做到这一点(获取所有父母很容易,然后兄弟姐妹意味着获取每个父母的父母的孩子),但我真的希望已经存在一个框架可以有效地完成这一切。

我简要地研究了

rpart
tree
ape
,但据我从我的简短评论中可以看出,它们的目标是树的统计分类,而不是节点的操作/检索,在我看来,它们是基于在一个有点敷衍的评论中,他们没有提供我想要的功能(很可能我只是错过了它/误解了它)。

另一个选项似乎是

XML
xmlTree
,它允许我使用一些 DOM 操作工具来实现我的目标,但它似乎有点笨拙,也许不是最佳选择。

r tree igraph
2个回答
2
投票

Iv on msl n iilrstatosnmeostms,adIv uulyjstrledm w slto.I get ta heXLpckgs r vekl frfcue rolmsscha ti.Th Gah akgei ne,bu ewr。 tisa ntrac t lbrryadiszr-idxe ulk hihs1inee).Iv set tsccsfly btthr awysses obeapinu ebgin poes nwhc Ike fnin ushfed inee。例如

o[ne] a ocag o
o[ne-].

gi,'rbal us olm on omthn lk:

佛< srctr(is(hid=1:0 prnt=c(A,1,L00031L 5,6, L 8, L 1,1L 2L 1, 4,1L L 1L 8,1L),.ae (cid,"aet) ls dt.fae,rwnms=cN,-0)

etacety -fncin(oe at=o,acsr=(){
    prnt< dt$prn[dt$hl %n oe
    f(s.a(aet) 
        etr(ncery)
     lse {
       ge_ncsr(prnt aa,canety,paen)
    
}

e_cidrn -fucio(ods,daafo) {
    nit(apl(nde,fuctonx) dtacil[at$pret %in% x]}))
}

oane< gt_nesr(3)
yelw - e_cidrn(rage)

1
投票

感谢您的指点,

igraph
绝对是我正在寻找的东西,尽管我有点超出了我的深度。 在 python
igraph
教程
的帮助下,我能够得到:

g <- graph(t(as.matrix(df[-1, 2:1])))            # Make graph
plot(g)                                          # yes, this matches mine
parents <- unlist(                               # orange nodes  
  neighborhood(
    g, 
    order=ecount(g),                             # how many steps to go up, this should guarantee we get to root  
    nodes=13,                                    # starting point    
    mode="in"                                    # head in towards root
  )
)[-1L]
setdiff(                                         # yellow nodes  
  unique(                                        
    unlist(
      lapply(parents, neighborhood, graph=g, order=1, mode="out")
  ) ),
  c(parents, 13)
)

这会产生所需的答案。 不幸的是,由于

neighborhood
函数的返回格式,每个步骤都需要进行一些后处理。

© www.soinside.com 2019 - 2024. All rights reserved.