いくつかの特定の基準に基づいて、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
を使用して上記のような再帰的なタスクを実行する方法はありますか?
これまでの私のこの試みは適切でしょうか? http://stackoverflow.com/a/39869503/6197649 –
問題は、プルーニングを除いて、ツリー構造を維持したいということです。区切られたノードパス(xpathのような)を作成してから平坦化し、最終的に階層を再構築することを考えましたが、これはlapplyを使用するよりも難しく、より控えめなようでした。 –
'purrr :: map'は' lapply'(いくつかの追加機能付き)の代わりとなりますが、ここでやっていることを本当に変更することはありません。あなたは再帰的な 'rapply'をチェックするかもしれませんが、正しく動作するにはちょっと厄介なことがあります。 – alistaire