Это можно сделать с помощью пакета igraph
, но это решение теории графов, а не базы данных.
library(igraph)
g <- graph_from_data_frame(dat)
res <- lapply(V(g), function(i) dfs(g, i, unreachable = FALSE)$order)
res <- lapply(res, function(e) e[!is.na(e)])
sapply(res, function(e) names(e)[length(e)])
# 1 2 5 4 6 12 7
#"12" "12" "12" "12" "7" "12" "7"
Обратите внимание, что при необходимости вы можете привести конечный результат к классу integer
.
Данные.
dat <-
structure(list(old_item_id = c(1L, 2L, 5L, 4L, 6L), new_item_id = c(2L,
5L, 12L, 5L, 7L), date_of_change = structure(c(16436, 16437,
16709, 16437, 16468), class = "Date")), row.names = c(NA, -5L
), class = "data.frame")