R语言中如何将树形结构DataFrame转换为宽表
R语言树形结构DataFrame转宽表实现方法
方法1:使用data.tree包(适配任意层级的树形结构,推荐)
该方法无需手动适配层级数量,支持动态生成对应层级的宽表列,适合层级不确定或者层级较多的场景。
- 第一步:安装加载依赖包
# 安装包(仅首次执行) install.packages("data.tree") # 加载包 library(data.tree) library(tidyverse)
- 第二步:构造原始树形结构的全路径
首先给原始数据新增pathString字段,存储每个节点从根节点到当前节点的完整路径:
# 代码中的tree_df替换为你自己的原始树形结构DataFrame即可 tree_df$pathString <- sapply(tree_df$node_id, function(current_id){ path <- c() # 递归向上查找父节点拼接路径 while(!is.na(current_id)){ current_node <- tree_df$node_name[tree_df$node_id == current_id] path <- c(current_node, path) current_id <- tree_df$parent_id[tree_df$node_id == current_id] } paste(path, collapse = "/") })
- 第三步:转换为宽表
# 转换为树形对象 tree_obj <- as.Node(tree_df) # 导出为宽表 wide_df <- as.data.frame(tree_obj, row.names = NULL)
方法2:使用tidyverse手动关联(适配固定层级的树形结构)
如果你的树形结构层级固定,无需兼容后续层级扩展,可以用逐层关联的方法实现,无需安装额外的树形处理包:
# 以下示例为3级树形结构,层级数量可根据你的实际情况调整 # 提取各层级节点 level_1 <- tree_df %>% filter(level == 1) %>% select(l1_name = node_name, l1_id = node_id) level_2 <- tree_df %>% filter(level == 2) %>% select(l2_name = node_name, l2_id = node_id, parent_id) level_3 <- tree_df %>% filter(level == 3) %>% select(l3_name = node_name, parent_id) # 逐层关联得到宽表 wide_df <- level_3 %>% left_join(level_2, by = c("parent_id" = "l2_id")) %>% left_join(level_1, by = c("parent_id.y" = "l1_id")) %>% # 按需保留对应层级的列即可 select(l1_name, l2_name, l3_name)
内容的提问来源于stack exchange,提问作者Peter P.
相关产品推荐
相关产品推荐

