2017-01-10 17 views
2

いくつかの特定の基準に基づいて、Rでネストされたリストの階層からなるツリーを整理したいとします。私は「簡単に」十分lapplyを使用してこれを行うことができます。任意の階層をpurrrで再帰的に処理する

# Based an example from the NetworkD3 documentation 
# https://christophergandrud.github.io/networkD3/ 

URL <- paste0(
    "https://cdn.rawgit.com/christophergandrud/networkD3/", 
    "master/JSONdata//flare.json") 

flare <- jsonlite::fromJSON(URL, simplifyDataFrame = FALSE) 

# Leaf nodes have a "size" attribute. Let's say we want to 
# prune all the nodes with size < 5000. 

prune <- function(tree) { 
    if ("children" %in% names(tree)) { 
    p <- lapply(tree$children, prune) 
    pp <- p[!unlist(lapply(p, is.null))] 
    copied_tree = list() 
    copied_tree$name = tree$name 
    copied_tree$children = pp 
    return(copied_tree) 
    } else if (tree$size < 5000) { 
    return(NULL) 
    } 
    return(tree) 
} 

pruned <- prune(flare) 

R でのデータサイエンスため、ハドレーウィッカムdiscussesは、シナリオの数がpurrrで階層データを扱うための機能のapply家族を置き換えることができます。しかし、これらの例は、単独でネストされたリスト、または深くネストされたリストの特定のノードを扱うように見えます。

purrrを使用して上記のような再帰的なタスクを実行する方法はありますか?

+0

これまでの私のこの試みは適切でしょうか? http://stackoverflow.com/a/39869503/6197649 –

+0

問題は、プルーニングを除いて、ツリー構造を維持したいということです。区切られたノードパス(xpathのような)を作成してから平坦化し、最終的に階層を再構築することを考えましたが、これはlapplyを使用するよりも難しく、より控えめなようでした。 –

+1

'purrr :: map'は' lapply'(いくつかの追加機能付き)の代わりとなりますが、ここでやっていることを本当に変更することはありません。あなたは再帰的な 'rapply'をチェックするかもしれませんが、正しく動作するにはちょっと厄介なことがあります。 – alistaire

答えて

3
library(purrr) 
prune_2 <- function(tree) { 
    # print(tree$name) 
    # print(map_lgl(tree$children, ~ "size" %in% names(.x))) 
    tree$children %<>% 
    map_if(~ "children" %in% names(.x), prune_2) %>% 
    discard(~ if ("size" %in% names(.x)) .x$size < 5000 else FALSE) 
    tree 
} 
pruned_2 <- prune_2(flare) 
identical(pruned, pruned_2) 
# [1] TRUE 
+0

これは非常にエレガントです(そして印象的です)!ティルドがここで何をするのか教えていただけますか?私はこのシンボルがどのように使われているのか不明です - 統計モデルやggplotファセットで使われていることは知っていますが、Rでどのように解釈されているのかわかりません。 –

+1

ありがとう。チルダは、Rの汎用構文である式のためのものです。ここでは暗黙の引数として '.x'と' .y'を使用して匿名関数のショートカットとして使用されています。 '〜.x + 1'は' function(.x).x + 1'と同等です。例えば、 'purrr' READMEや' help(map) 'を参照してください。 –

関連する問題