将数据集与结果数据集迭代联接

时间:2019-04-25 05:16:08

标签: r

我正在尝试在2列的数据框中找到循环路径

例如:

Col1 Col2 
A    B 
C    A 
B    D 
D    C

Table

所以,A-B-D-C-A是环形路线

df <- sqldf("Select * from circuit as 'A' INNER JOIN circuit as 'B' ON A.'To'= B.'FROM'")
result <- df[df$`FROM`==df$`TO..4`,]

这给了我所有双向路线,有没有办法我可以迭代地执行连接并找到所有可能的环形路线?

1 个答案:

答案 0 :(得分:0)

在上面我的评论中,我认为解决您的问题的一个很好的起点是将您的结构转换为图形。

df <- read.table(text =
    "Col1 Col2
    A B
    C A
    B D
    D C", header = T)

library(igraph)
ig <- graph_from_data_frame(df)

我们可以绘制图形

plot(ig)

enter image description here

我尚不清楚您的预期输出应该是什么,如上所述,您的样本数据似乎过于简单,无法推断出更通用的解决方案。话虽如此,在这种特定情况下,您可以提取图的所有循环,这些循环与从任何点/顶点(改编自r igraph find all cycles开始)的结构的所有圆形路径相对应

cycles <- list()
for (v1 in V(ig)) {
    for (v2 in neighbors(ig, v1)) {
        cycles[length(cycles) + 1] = lapply(
                all_simple_paths(ig, v2, v1),
                function(p) c(v1, p))
    }
}
cycles
#[[1]]
#  B D C A
#1 3 4 2 1
#
#[[2]]
#  A B D C
#2 1 3 4 2
#
#[[3]]
#  D C A B
#3 4 2 1 3
#
#[[4]]
#  C A B D
#4 2 1 3 4

您的示例图包含四个循环;例如list中的第一个周期是B -> D -> C -> A -> B,第二个周期是A -> B -> D -> C -> A,依此类推。

如果您有多个断开的循环子图,我先将您的图分解为这些组件(例如,使用decompose.graph),然后确定每个组件的循环。