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

如何遍历data.table获取ID的全部后继节点并合并为单行?

解决data.table中前驱后继链条的宽格式展开问题

针对你需要将同一ID的前驱后继链条整合为一行的需求,可以通过定位起始节点+迭代收集后继链条+转宽格式的方式实现,具体步骤如下:

1. 定位每个ID的起始前驱节点

首先找到每个ID中没有被任何节点作为后继的起始节点(也就是链条的最开头,比如示例中的"A"):

library(data.table)
data <- data.table(
  ID           = c(001, 001, 001),
  Predecessor  = c("A", "B", "C"),
  Successor    = c("B", "C", "D")
)

# 筛选出没有被作为后继的起始前驱
start_nodes <- data[!Predecessor %in% Successor, .(ID, Predecessor)]

2. 迭代收集完整后继链条

定义一个函数,根据ID和当前节点递归遍历所有后继,然后对每个起始节点生成完整链条:

# 递归获取单个节点的所有后继链条
get_succession_chain <- function(id, current_node) {
  chain <- c()
  repeat {
    next_node <- data[ID == id & Predecessor == current_node, Successor]
    if (length(next_node) == 0) break
    chain <- c(chain, next_node)
    current_node <- next_node
  }
  chain
}

# 为每个起始节点生成后继链条
start_nodes[, chain := lapply(Predecessor, function(x) get_succession_chain(ID, x)), by = ID]

3. 转换为宽格式并命名列

将收集到的链条转换为宽格式,并重命名对应的后继列:

# 将链条列表转成宽格式列
result <- start_nodes[, c(.SD, as.data.table(t(chain))), by = .(ID, Predecessor)]

# 重命名后继列(Successor、Successor2...)
col_names <- paste0("Successor", seq_len(ncol(result) - 2))
setnames(result, paste0("V", seq_len(ncol(result) - 2)), col_names)

运行后得到的result就是你需要的格式:

> result
   ID Predecessor Successor Successor2 Successor3
1:  1           A         B          C          D

注意事项

  • 如果你的ID是带前导零的字符串(比如"001"),需要将ID列定义为字符型,避免被自动转换为整数丢失前导零。
  • 如果存在多个ID的情况,上述代码会自动按ID分组处理每个链条。

内容的提问来源于stack exchange,提问作者Sven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:35:43