Найти прямых иерархических родителей листового узла в пакете data.tree в R - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать поддерево из дерева данных, и мне нужно выполнить дополнительные операции над поддеревом.

data(acme)
print(acme)

Acme Inc.                       
2   ¦--Accounting                  
3   ¦   ¦--New Software            
4   ¦   °--New Accounting Standards

5  ¦--  Research                    
6   ¦   ¦--New Product Line        
7   ¦   °--New Labs                
8 |--IT                          
9         |--Outsource               
10       ¦--Go agile                
11       °--Switch to R  

Теперь я хочу создать поддерево, соответствующее узлу листа, указанному вПеременная name ниже:

name<-"New Labs"

Следующий код дает мне необходимое поддерево:

subtree<-(FindNode(acme, name)$parent)$parent
print (subtree)

Acme Inc.       
2  °--Research    
3      °--New Labs

Но мне нужен код, который не требует многократного повторения «$ parent» &дает всех родителей до корня дерева.

Любая помощь в этом была бы очень признательна.

Спасибо

1 Ответ

0 голосов
/ 23 мая 2018

Идея состоит в том, чтобы Prune от исходного дерева до нового дерева.

Мы можем найти путь любого Node с правомочностью path, а затем Prune() дерева.дерево и сохраняя только узлы, совпадающие с путем.

Поскольку Prune() перезаписывают исходное дерево, мы, вероятно, Clone() должны его сначала.

library(data.tree)
data("acme")

acme
#>                           levelName
#> 1  Acme Inc.                       
#> 2   ¦--Accounting                  
#> 3   ¦   ¦--New Software            
#> 4   ¦   °--New Accounting Standards
#> 5   ¦--Research                    
#> 6   ¦   ¦--New Product Line        
#> 7   ¦   °--New Labs                
#> 8   °--IT                          
#> 9       ¦--Outsource               
#> 10      ¦--Go agile                
#> 11      °--Switch to R

extract_subtree <- function(tree, node_name) {
  new_tree <- Clone(tree)
  initial_node <- FindNode(new_tree, node_name)
  initial_node$path
  Prune(new_tree, prunFun = function(N) N$name %in% initial_node$path)
  return(new_tree)
}

pruned_acme <- extract_subtree(acme, 'New Labs')

pruned_acme
#>          levelName
#> 1 Acme Inc.       
#> 2  °--Research    
#> 3      °--New Labs


acme
#>                           levelName
#> 1  Acme Inc.                       
#> 2   ¦--Accounting                  
#> 3   ¦   ¦--New Software            
#> 4   ¦   °--New Accounting Standards
#> 5   ¦--Research                    
#> 6   ¦   ¦--New Product Line        
#> 7   ¦   °--New Labs                
#> 8   °--IT                          
#> 9       ¦--Outsource               
#> 10      ¦--Go agile                
#> 11      °--Switch to R

Создано в 2018-05-23 представьте пакет (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...