如何将data.tree树结构转回保留原始行的DataFrame并添加层级信息
解决方法
我们可以通过data.tree的节点遍历功能提取所有节点的完整层级路径,再与原始DataFrame合并,实现为每一行添加对应child的完整层级信息。
步骤1:准备示例数据
先构造父子关系的示例DataFrame并转换为树结构:
library(data.tree) # 原始父子结构数据 x <- data.frame( parent = c(NA, "Root", "Root", "A", "A", "B"), child = c("Root", "A", "B", "A1", "A2", "B1") ) # 转换为树结构 my_tree <- FromDataFrameNetwork(x)
步骤2:提取所有节点的完整层级信息
遍历树的所有节点,获取每个节点的根到自身的层级路径,生成对应DataFrame:
# 遍历节点提取层级信息 hierarchy_df <- lapply(my_tree$Get(function(node) node), function(node) { # 获取根到当前节点的路径 path <- node$path # 命名层级列(Level1、Level2...) hierarchy_cols <- setNames(path, paste0("Level", seq_along(path))) # 组合child节点名与层级列 c(data.frame(child = node$name), as.data.frame(t(hierarchy_cols))) }) %>% do.call(rbind, .)
步骤3:与原始DataFrame合并
按child列合并原始数据和层级信息,确保原始数据的每一行都被保留:
# 合并得到最终结果 result <- merge(x, hierarchy_df, by = "child", all.x = TRUE)
结果示例
运行后result会包含原始父子列及完整层级列,行数与原始DataFrame一致:
child parent Level1 Level2 Level3 1 A Root Root A <NA> 2 A1 A Root A A1 3 A2 A Root A A2 4 B Root Root B <NA> 5 B1 B Root B B1 6 Root <NA> Root <NA> <NA>
关键说明
node$path可直接获取根到当前节点的完整路径,无需手动拼接all.x = TRUE保证原始DataFrame的所有行都被保留,包括根节点
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

