【问题标题】:Find all cycles in data查找数据中的所有循环
【发布时间】:2020-01-31 03:02:25
【问题描述】:

我有包含“from”和“to”列的数据:

df = data.frame(from = c('A','A','X','E','B','W','C','Y'),
                to  = c('B','E','Y','C','A','X','A','W'))

我想识别所有“从-到”序列,考虑两行或多行,它们以相同的值开始和结束。一个简单的方法是A-B-A

# df
#   from to
# 1    A  B # 1. From A to B
# 2    A  E
# 3    X  Y
# 4    E  C
# 5    B  A # 2. From B and back to the starting point A, completing the sequence A-B-A
# 6    W  X
# 7    C  A
# 8    Y  W

另一个:

# df
#   from to
# 1    A  B 
# 2    A  E # 1.
# 3    X  Y
# 4    E  C # 2.
# 5    B  A 
# 6    W  X
# 7    C  A # 3. -> Thus: A - E - C - A
# 8    Y  W

还有例如X - Y - W - X

我怎样才能找到这样的循环?

【问题讨论】:

  • 您想从数据框中找到所有循环以显示“它们”。他们是什么?请更具体。您是否希望在列之间找到匹配项?您是否在每列中寻找这些组合?没有更多细节,这太难了。
  • @SharpSharpLes 嗨,我只想从数据框中找到所有循环!所有循环都以粗体列出。但我不知道锄头使用代码来查找!

标签: r dataframe cycle


【解决方案1】:

这是另一种选择:

library(igraph)
g <- graph_from_data_frame(h)

#https://lists.nongnu.org/archive/html/igraph-help/2009-04/msg00125.html
find.cycles <- function(graph, k) {
    ring <- graph.ring(k, TRUE)
    subgraph_isomorphisms(ring, graph)
}

#find all cycles
N <- length(unique(unlist(h)))
l <- unlist(lapply(1L:N, find.cycles, graph=g), recursive=FALSE)

#extract the vertices in each cycle
Filter(Negate(is.null), lapply(l, function(e) {
    if (length(e) > 1L) {
        nm <- names(e)
        c(nm, nm[1L])
    }
}))

输出:

[[1]]
[1] "A" "B" "A"

[[2]]
[1] "B" "A" "B"

[[3]]
[1] "A" "E" "C" "A"

[[4]]
[1] "X" "Y" "W" "X"

[[5]]
[1] "E" "C" "A" "E"

[[6]]
[1] "W" "X" "Y" "W"

[[7]]
[1] "C" "A" "E" "C"

[[8]]
[1] "Y" "W" "X" "Y"

参考:

Re: [igraph] Help - find cycles by Gábor Csárdi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2019-04-13
    • 2010-10-07
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多