You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:34:54