gpt4 book ai didi

r - 从树递归创建 data.frame 的正确方法

转载 作者:行者123 更新时间:2023-12-04 10:52:29 25 4
gpt4 key购买 nike

我想创建一个平面 data.frame来自 R 中的一棵树。

树由一个列表表示,每个列表包含一个名为 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 在运行 NULL 后评估为 walk_tree )。

递归构建 data.frame 的正确方法是什么?从 R 中的一棵树?

最佳答案

一种方法是将所有具有“names”和“parent_name”的节点聚集在一起,并用它们制作一个数据框。

#Flatten the nested structure
u_tree <- unlist(tree)

#Gather all the indices where name of the node is equal to parent_name
inds <- grepl("parent_name$", names(u_tree))

#Add them in a dataframe
data.frame(name = u_tree[!inds], parent_name = u_tree[inds])

# name parent_name
# root None
#2 child1 root
#3 child2 root
#4 child3 child2

关于r - 从树递归创建 data.frame 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48738654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com