【问题标题】:Iteratively join dataset with the resulting dataset迭代地将数据集与结果数据集连接起来
【发布时间】:2019-04-25 14:22:29
【问题描述】:

我正在尝试在具有 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`,]

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

【问题讨论】:

  • 我觉得您的示例数据有点过于简单,无法提供强大且通用的解决方案。例如,对于更复杂的情况(例如在不明确路径的情况下),您的预期输出是什么?我可能会从图表的角度来解决这个问题。 library(igraph); ig &lt;- graph_from_data_frame(df) 将返回一个 igraph 对象。然后,您可以使用clusters 识别连接的子图并从那里开始工作;或使用decompose.graphig 拆分为连接子图的list

标签: r


【解决方案1】:

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

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)

我并不完全清楚您的预期输出应该是什么,并且如前所述,您的示例数据似乎过于简单,无法推断出更通用的解决方案。话虽如此,在这种特殊情况下,您可以提取图形的所有循环,它们对应于从任何点/顶点开始的结构的所有循环路径(改编自 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 -&gt; D -&gt; C -&gt; A -&gt; B,第二个循环是A -&gt; B -&gt; D -&gt; C -&gt; A等等。

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

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2013-05-17
    • 1970-01-01
    • 2020-11-16
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多