如何将R中存储树路径的宽表dataframe转为节点上游网络长表
R实现宽格式树路径转全上游节点邻接表
实现思路
核心逻辑是对每条根到叶的路径,生成所有前驱节点和后继节点的配对,再补充无下游节点的空值行即可,适配任意列数、多根节点的数据集。
实现代码
# 加载依赖包 library(tidyverse) # 处理逻辑 result <- df_wide %>% # 逐行提取非NA的路径节点 pmap_dfr(function(...) { path <- na.omit(c(...)) path_len <- length(path) # 路径长度不足2的无配对,直接返回空 if (path_len < 2) return(tibble()) # 生成所有i<j的节点配对(i为down,j为对应up) expand.grid(i = seq_len(path_len - 1), j = seq(i + 1, path_len)) %>% transmute( down = path[i], up = path[j] ) }) %>% # 去重重复的配对记录 distinct() %>% # 补充无下游节点的记录,up填NA { all_nodes <- unique(c(.$down, .$up)) nodes_with_downstream <- unique(.$down) nodes_no_downstream <- setdiff(all_nodes, nodes_with_downstream) bind_rows(., tibble(down = nodes_no_downstream, up = NA_real_)) } %>% # 可选:按down列排序,匹配示例输出顺序 arrange(down)
代码特性
- 无需指定宽表列数,自动适配任意层级的路径数据
- 原生支持多根节点场景,无需额外修改逻辑
- 内置去重逻辑,避免重复的节点配对
内容的提问来源于stack exchange,提问作者lucyandrews
相关产品推荐
相关产品推荐

