r igraph 查找所有循环

2024-02-12

我已经指示 igraph 并想要获取所有周期。周长函数可以工作,但只返回最小的周期。 R中有没有一种方法可以获取长度大于3的图中的所有循环(没有顶点指向自身和循环)


Answer recommended by R Language /collectives/r-language Collective

它不是 igraph 中直接的函数,但当然您可以对其进行编码。要找到循环,您从某个节点开始,转到某个相邻节点,然后找到一条返回原始节点的简单路径。由于您没有提供任何示例数据,我将用一个简单的例子来说明。

样本数据

## Sample graph
library(igraph)
set.seed(1234)
g = erdos.renyi.game(7, 0.29, directed=TRUE)
plot(g, edge.arrow.size=0.5)

寻找周期

让我从一个节点和一个邻居开始。节点 2 连接到节点 4。因此,某些循环可能类似于 2 -> 4 ->(除 2 或 4 之外的节点)-> 2。让我们获取所有这样的路径。

v1 = 2
v2 = 4
lapply(all_simple_paths(g, v2,v1, mode="out"), function(p) c(v1,p))
[[1]]
[1] 2 4 2
[[2]]
[1] 2 4 3 5 7 6 2
[[3]]
[1] 2 4 7 6 2

我们看到有从 2 开始的三个循环,其中 4 作为第二个节点。 (我知道你说长度大于 3。我会再讨论这一点。)

现在我们只需要对每个节点 v1 和 v1 的每个邻居 v2 执行此操作。

Cycles = NULL
for(v1 in V(g)) {
    for(v2 in neighbors(g, v1, mode="out")) {
        Cycles = c(Cycles, 
            lapply(all_simple_paths(g, v2,v1, mode="out"), function(p) c(v1,p)))
    }
}

整个图中有 17 个周期。不过,您可能需要考虑两个问题,具体取决于您想要如何使用它。首先,你说你想要长度大于 3 的循环,所以我假设你不想要看起来像 2 -> 4 -> 2 的循环。这些很容易摆脱。

LongCycles = Cycles[which(sapply(Cycles, length) > 3)]

LongCycles 有 13 个周期,消除了 4 个短周期

2 -> 4 -> 2
4 -> 2 -> 4
6 -> 7 -> 6
7 -> 6 -> 7

但这份清单指出了另一个问题。仍然有一些您可能认为是重复的循环。例如:

2 -> 7 -> 6 -> 2
7 -> 6 -> 2 -> 7
6 -> 2 -> 7 -> 6

您可能想清除这些。要获得每个循环的一个副本,您始终可以选择以最小顶点编号开始的顶点序列。因此,

LongCycles[sapply(LongCycles, min) == sapply(LongCycles, `[`, 1)]
[[1]]
[1] 2 4 3 5 7 6 2
[[2]]
[1] 2 4 7 6 2
[[3]]
[1] 2 7 6 2

这仅给出了不同的周期。


关于效率和可扩展性的补充

我提供了一个更有效的代码版本 最初提供。然而,其主要目的是 认为除了非常简单的图表之外,你将无法 生产所有周期.

这是一些更有效的代码。它消除了许多检查 无法产生循环或将被淘汰的情况 作为冗余循环。为了方便运行测试 我想要的,我把它变成了一个函数。

## More efficient version
FindCycles = function(g) {
    Cycles = NULL
    for(v1 in V(g)) {
        if(degree(g, v1, mode="in") == 0) { next }
        GoodNeighbors = neighbors(g, v1, mode="out")
        GoodNeighbors = GoodNeighbors[GoodNeighbors > v1]
        for(v2 in GoodNeighbors) {
            TempCyc = lapply(all_simple_paths(g, v2,v1, mode="out"), function(p) c(v1,p))
            TempCyc = TempCyc[which(sapply(TempCyc, length) > 3)]
          TempCyc = TempCyc[sapply(TempCyc, min) == sapply(TempCyc, `[`, 1)]
          Cycles  = c(Cycles, TempCyc)
        }
    }
    Cycles
}

然而,除了非常简单的图形之外,还有一个组合 可能的路径爆炸,因此找到所有可能的循环就是 完全不切实际,我将用更小的图表来说明这一点 比你在评论中提到的那个。

首先,我将从一些小图开始,其中边的数量 大约是顶点数的两倍。生成我的代码 示例如下,但我想重点关注循环数,所以我 我们将从结果开始。

## ecount ~ 2 * vcount
Nodes   Edges   Cycles
10   21    15
20   41    18
30   65    34
40   87   424
50  108  3433
55  117 22956

但您报告说您的数据大约是 许多边作为顶点。让我们看一些这样的例子。

## ecount ~ 5 * vcount
Nodes  Edges    Cycles
10      48        3511
12      61       10513
14      71      145745

以此作为循环数的增长,使用10K节点 50K 边似乎是不可能的。顺便说一句,花了好几个时间 分钟来计算具有 14 个顶点和 71 条边的示例。

为了重现性,以下是我生成上述数据的方法。

set.seed(1234)
g10 = erdos.renyi.game(10, 0.2, directed=TRUE)
ecount(g10)
length(FindCycles(g10))

set.seed(1234)
g20 = erdos.renyi.game(20, 0.095 , directed=TRUE)
ecount(g20)
length(FindCycles(g20))

set.seed(1234)
g30 = erdos.renyi.game(30, 0.056 , directed=TRUE)
ecount(g30)
length(FindCycles(g30))

set.seed(1234)
g40 = erdos.renyi.game(40, 0.042 , directed=TRUE)
ecount(g40)
length(FindCycles(g40))

set.seed(1234)
g50 = erdos.renyi.game(50, 0.038 , directed=TRUE)
ecount(g50)
length(FindCycles(g50))

set.seed(1234)
g55 = erdos.renyi.game(55, 0.035 , directed=TRUE)
ecount(g55)
length(FindCycles(g55))

##########
set.seed(1234)
h10 = erdos.renyi.game(10, 0.55, directed=TRUE)
ecount(h10)
length(FindCycles(h10))

set.seed(1234)
h12 = erdos.renyi.game(12, 0.46, directed=TRUE)
ecount(h12)
length(FindCycles(h12))

set.seed(1234)
h14 = erdos.renyi.game(14, 0.39, directed=TRUE)
ecount(h14)
length(FindCycles(h14))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

r igraph 查找所有循环 的相关文章

  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • 获取函数的命名空间

    我正在开发一个包 我希望在其中向对象添加编辑历史记录 该包允许其他包注册用于编辑对象的函数 我正在寻找一种方法来记录注册用于编辑的函数的包的版本 问题是 给定一个函数 如何从导出的位置获取包 我的想法是调查它的搜索路径 但是search 仅
  • 跟踪循环迭代

    抛硬币 成功 你赢100 否则你输50 你会一直玩 直到你口袋里有钱a 的价值如何a在任何迭代中都被存储 a lt 100 while a gt 0 if rbinom 1 1 0 5 1 a lt a 100 else a lt a 50
  • 无法更新/编辑从 R 中的包(`gratia`)导出的 ggplot2 对象

    我希望我在这里遗漏了一些令人痛苦的明显的东西 我希望更新 例如 修复标题 实验室等 由 生成的 ggplot 对象gratia draw 不太确定为什么我无法更新该对象 有一个简单的解决方案吗 devtools install github
  • R、Rcpp 与 Armadillo 中矩阵 rowSums() 与 colSums() 的效率

    背景 来自 R 编程 我正在扩展到 C C 形式的编译代码Rcpp 作为循环交换 以及一般的 C C 效果的实践练习 我实现了 R 的等效项rowSums and colSums 矩阵的函数Rcpp 我知道它们以 Rcpp 糖的形式存在 并
  • R中的字典数据结构

    在 R 中 我有 例如 gt foo lt list a 1 b 2 c 3 如果我输入foo I get a 1 1 b 1 2 c 1 3 我怎样才能看透foo仅获取 键 列表 在这种情况下 a b c R 列表可以具有命名元素 因此可
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何在 data.table 中分组后使用条件计算行数

    我有以下数据框 dat lt read csv s1 s2 v1 v2 a b 10 20 a b 22 NA a b 13 33 c d 3 NA c d 4 5 NA c d 10 20 dat gt A tibble 6 x 4 gt
  • R ggplot 中的柯尔莫哥洛夫-斯米尔诺夫图

    我正在尝试在 r 中绘制 KS 图 一切似乎都很顺利 除了我只能使用颜色来可视化两个不同的样本而不是线型这一事实 我已经尝试过以下方法 sample1 lt SD13009 sample2 lt SD13009PB group lt c r
  • 闪亮的应用程序包:css 和所有 www/ 目录内容

    我正在尝试将 Shiny 应用程序转换为 R 包 但我在处理有关 www 目录以及 松散 文件的所有问题时遇到了问题 我闪亮的应用程序运行得很好 但是当我尝试 打包它 时 它不起作用 我闪亮的应用程序目录 my shiny app R ut
  • 如何声明包含 M 个元素的列表对象

    我想声明一个包含 M 3 x 3 矩阵的列表 如果我事先知道数字 M 那么我可以通过以下方式声明这样的列表 elm lt matrix NA 3 3 Say M 7 myList lt list elm elm elm elm elm el
  • 在r中的某个阈值处破坏 cumsum() 函数

    例如我有以下代码 cumsum 1 100 我想打破它 如果一个元素 i 1 大于3000 我怎样才能做到这一点 因此 而不是这个结果 1 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 15
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • 在包加载之前如何知道 R 中特定函数属于哪个包?

    例如 我知道许多流行的功能 例如tbl df 我通常不记得它属于哪个包 即data table or dplyr 所以我必须始终记住并加载一个包 但我做不到 tbl df除非我加载了正确的包 在 R 控制台本身加载或安装包之前 有没有办法知
  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • dplyr:连接中的 NSE (by)

    我很难弄清楚如何使用 dplyr left join 和 NSE 连接两个表 问题是我无法为 by 提供正确的值 我想我现在已经找到了解决方案 但感觉我正在以一种额外复杂的方式来做 因此 如果您知道更简单 更优雅的解决方案 请告诉我 这就是
  • 如何为自定义 S3 类实现提取/取子集 ([ [<-, [[ [[<-)] 函数?

    我有一个自定义的 S3 类foo 它在正常的基础上添加了一些自定义行为data frame foo object lt data frame class foo object lt c foo data frame 对于这个类 还应该有一个
  • ggplot:如何限制条形图中的输出,以便仅显示最频繁出现的情况?

    我几个小时以来一直在寻找这个简单的东西 但没有结果 我有一个数据框 其中一列为变量 国家 地区 我想要两件事以下 绘制最常见的国家 地区 最常见的位于顶部 找到部分解决方案EDIT找到完整的解决方案 gt gt 重点问题是根据频率限制条形图

随机推荐

  • Android 布局 - 以编程方式设置自定义布局组件的值

    我定义了一个简单的自定义布局 其中包括文本视图和图像视图 在我的主布局中 我想多次使用此布局 并且想为代码中的这些文本和图像视图添加值 现在手动 但后来通过从数据库获取数据 我如何在我的代码中访问这些组件 这是我的主要布局 xml 文件
  • 用于多个可见 HTML 元素的 Aria 两种方式标签

    我有一组可以相互影响的元素 div class cont a href Click Me a span Count span class count span span span Count span class count span sp
  • 异步回发后性能下降 - 滚动变得可怕

    我的任务是帮助提高 ASP NET 4 5 Web 表单应用程序的性能 不幸的是 该应用程序使用了 updatepanel 他们真的很邪恶 http encosia com why aspnet ajax updatepanels are
  • 如何部署具有多个验证器的超级账本锯齿网络?

    我正在尝试至少配置一个锯齿网络2 验证者和一些事务处理器 我使用的是 Ubuntu 18 04 所以唯一可能的解决方案是使用 docker 我搜索了一整天的工作示例 但仍然没有运气 官网上有一个例子here https sawtooth h
  • iOS 中 UITableView 的展开/折叠部分

    有人可以告诉我执行方法吗UITableView可展开 可折叠动画sections of UITableView如下 or 您必须创建自己的自定义标题行并将其作为每个部分的第一行 子类化UITableView或者已经存在的标题会很痛苦 根据他
  • 在 apex salesforce 中调试可计划作业

    我正在尝试运行一个可调度的作业我从未在 salesforce 中使用过可调度的作业 这是我的代码 global class scheduledMerge implements Schedulable global void execute
  • 在不同的远程结账分支

    我有一个带有另一个遥控器的存储库upstream除了origin 我可以git checkout origin master 但是当我跑步时git checkout upstream master I get error pathspec
  • 在 R 中操作子矩阵

    Nh lt matrix c 17 26 30 17 23 17 24 23 nrow 2 ncol 4 Nh Sh lt matrix c 8 290133 6 241174 6 096808 7 4449672 6 894924 7 6
  • SwipeItem XAML 绑定被忽略

    我无法让任何绑定适用于SwipeItem在一个RadListView 这类似于标准ListView 特别是 我试图绑定到Command财产 但是 我尝试绑定到其他属性 例如 Text 但无济于事
  • 跨多个 PdfPCell 的 iText RadioGroup/RadioButtons

    我想制作一个包含多行的 PdfPTable 在每一行中 我希望第一个单元格中有一个单选按钮 第二个单元格中有一个描述性文本 我希望所有单选按钮都属于同一单选按钮组 我过去曾使用 PdfPCell setCellEvent 和我自己的自定义
  • 从数据 API 动态创建递归树视图的最佳方法

    我正在学习 Angular 2 尝试从 可能非常大 第三方 API 构建可扩展的树视图 该 API 的底层结构如下 Home id 1053 Rugby League id 1054 Super League id 1103 Castlef
  • 如何确定某个分支是否是 jenkins 文件中的默认分支?

    我们在詹金斯上有一个多分支管道 我知道可以检查分支是否与名称匹配 例如 when branch master 不幸的是 我们的默认分支没有命名为 master 并且默认分支的名称会定期更改 有没有办法在不检查名称的情况下检查给定分支是否是默
  • 片段中的可扩展列表视图-可扩展列表不显示

    我试图在 Fragements 中实现可扩展列表视图 我已经测试了设置为 toast 的所有值 它工作正常 但是我的可扩展列表视图不是 Dispaly 我没有收到任何错误 请在我使用的代码下面找到 package com test expa
  • QGridLayout不同的列宽

    我正在尝试创建一个如下所示的布局 1 2 3 4 基本上 我希望第一行的单元格 1 比单元格 2 更薄 但第二行的单元格 3 和 4 应具有相同的宽度 是否有可能在 PyQt4 中使用 QGridLayout 创建这样的布局 QGridLa
  • 如果使用 JavaScript 选中复选框,如何重定向到特定链接?

    如果使用 JavaScript 选中复选框 如何重定向到特定链接 我正在这样做 但它对我不起作用
  • 如何知道通过 iframe 加载的页面是否在沙箱内? [复制]

    这个问题在这里已经有答案了 我正在尝试检测页面是否是通过沙盒 iframe 加载的 这可能吗 例如 我们提供自定义的可嵌入小部件 有些人认为通过将它们沙箱在 iframe 中是很聪明的 但这会破坏某些事情 例如window top loca
  • Ruby w/ Sinatra:相当于 Rails 中的 .js.erb 的东西是什么?

    js erb 很好 因为您可以使用它们替换页面的部分内容 而无需离开当前页面 这给网站 应用程序带来了更干净 更简洁的感觉 有没有办法在 sinatra 中使用它们 或同等的 只需将 js 添加到您要传递 erb 的符号末尾即可 啦 调用
  • ggsignif 包错误 stat_signif 需要以下缺失的美观: y

    这是我的数据的发明示例 x lt c Control Case Case Case Control Control Control Case Case Case y lt c Dead Dead Dead Alive Alive Dead
  • 标签和破折号组件并排

    我正在使用达世币 我想做的一件事是并排放置标签和滑块 以下代码呈现此效果 我可以对代码执行什么操作 以便滑块标签和滑块并排显示 谢谢 html Div html Label First Slider dcc RangeSlider id m
  • r igraph 查找所有循环

    我已经指示 igraph 并想要获取所有周期 周长函数可以工作 但只返回最小的周期 R中有没有一种方法可以获取长度大于3的图中的所有循环 没有顶点指向自身和循环 Answer recommended by R Language collec