Я буду использовать пакет igraph
для решения рассматриваемой проблемы, поскольку это проблема теории графов.
Сначала создайте график из первых двух столбцов входного фрейма data.frame.
library(igraph)
g <- graph_from_data_frame(df1[1:2], directed = TRUE)
plot(g, edge.curved = TRUE, edge.arrow.size = 0.5)
Теперь получите пути из каждой вершины в df1$from
. Пути получаются с помощью поиска в ширину, функция bfs
.
paths_list <- vector("list", length = length(V(g)))
i <- 0L
for(v in V(g)){
i <- i + 1L
ord <- bfs(g, root = v, neimode = "out",
unreachable = FALSE, dist = TRUE)$dist
ord <- ord[is.finite(ord)]
paths_list[[i]] <- ord
}
from <- lapply(paths_list, function(x) names(x)[1])
to <- lapply(paths_list, function(x) paste(names(x)[x != 0], collapse = ","))
res <- data.frame(from = unlist(from), to = unlist(to), stringsAsFactors = FALSE)
res <- res[nchar(res$from) != 0, ]
res
# from to
#1 1 3,5,6,9,2,4,7,8
#2 2 7
#3 3 9,5,1,6,2,4,7,8
#4 4 8,3,9,5,1,6,2,7
#5 5 1,6,2,3,4,7,8,9
#6 6 2,4,7,8,3,9,5,1
#7 7 2
#8 8 3,9,5,1,6,2,4,7
#9 9 5,1,6,2,3,4,7,8
#10 10
#11 12 11