【发布时间】:2018-02-12 02:10:16
【问题描述】:
我想从 R 中的一棵树创建一个平面 data.frame。
树由一个列表表示,每个列表都包含一个名为 children 的键,其中包含更多具有更多子级的列表。
tree <-
list(name="root",
parent_name='None',
children=list(
list(parent_name="root", name="child1", children=list()),
list(parent_name="root", name="child2", children=list(list(parent_name="child2", name="child3", children=c())))
)
)
我想将其“扁平化”为具有以下结构的data.frame:
name parent_name
1 root None
2 child1 root
3 child2 root
4 child3 child2
我可以使用以下递归函数完成此操作:
walk_tree <- function(node) {
results <<- rbind(
results,
data.frame(
name=node$name,
parent_name=node$parent_name,
stringsAsFactors=FALSE
)
)
for (node in node$children) {
walk_tree(node)
}
}
这个函数可以正常工作,但需要我在函数之外声明一个results data.frame:
results <- NULL
walk_tree(tree)
results # now contains the data.frame as desired
此外,当 walk_tree 函数作为函数包含在包中时,使用 <<- 运算符会导致出现以下警告:
Note: no visible binding for '<<-' assignment to 'results'
使用<- 运算符不会(results 在运行walk_tree 后计算为NULL)。
从 R 中的树递归构建 data.frame 的正确方法是什么?
【问题讨论】:
-
@RonakShah 是的!愿意发布答案以便我标记它吗?
-
@RonakShah 实际上,我很好奇这是否会达到深度嵌套树的极限。我要先写几个测试。
-
只要遵循命名约定(“name”和“parent_name”),无论树的深度如何,都应该没问题。