如何在R语言中递归获取数据框每个节点的最终节点?
R语言递归映射获取最终节点解决方案
首先给出原始数据(建议添加stringsAsFactors = FALSE避免因子类型问题):
x <- data.frame( old = c("start1", "start2", "start3", "start4", "inter1", "inter2", "inter3"), new = c("final1", "final1", "inter1", "inter3", "inter2", "final2", "final3"), stringsAsFactors = FALSE )
方法一:纯递归函数实现
无需额外安装包,直接通过递归查找每个节点的最终映射:
# 定义递归函数,输入节点和映射表,返回最终节点 find_final <- function(node, mapping) { next_node <- mapping$new[mapping$old == node] # 终止条件:没有下一个节点,或下一个节点不在映射的起点列中(即无后续映射) if (length(next_node) == 0 || !(next_node %in% mapping$old)) { return(next_node) } else { # 递归查找下一个节点的最终映射 return(find_final(next_node, mapping)) } } # 对每个old节点应用函数,生成最终节点列 x$final_node <- sapply(x$old, find_final, mapping = x) # 查看结果 print(x)
运行后输出结果:
old new final_node 1 start1 final1 final1 2 start2 final1 final1 3 start3 inter1 final2 4 start4 inter3 final3 5 inter1 inter2 final2 6 inter2 final2 final2 7 inter3 final3 final3
方法二:利用igraph包处理有向图
如果映射关系复杂(比如多分支、多层级),用图论工具更高效:
# 安装包(首次使用需执行) # install.packages("igraph") library(igraph) # 将映射关系转为有向图 g <- graph_from_data_frame(x, directed = TRUE) # 筛选出所有出度为0的节点(即最终节点,没有后续映射) final_nodes <- V(g)[degree(g, mode = "out") == 0]$name # 定义函数获取节点的最终映射 get_final_node <- function(node) { # 获取从当前节点到最终节点的路径,取路径终点 paths <- all_simple_paths(g, from = node, to = final_nodes) tail(unlist(paths[[1]]), 1) } # 生成最终节点列 x$final_node <- sapply(x$old, get_final_node) # 查看结果 print(x)
两种方法都能得到预期的最终节点映射结果。
内容的提问来源于stack exchange,提问作者qfazille
相关产品推荐
相关产品推荐

