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中的一元加/减是什么?

    来自 R 的详细信息部分Syntax http stat ethz ch R manual R patched library base html Syntax html帮助页面 定义了以下一元和二元运算符 他们被列出 在优先级组中 从最高
  • R - Plm 和 lm - 固定效应

    我有一个平衡面板数据集 df 本质上由三个变量组成 A B and Y 对于一堆独特识别的区域来说 它会随着时间的推移而变化 我想运行一个回归 其中包括区域 下面等式中的区域 和时间 年份 固定效应 如果我没记错的话 我可以通过不同的方式来
  • 使用 purrr 迭代替换数据帧列中的字符串

    我想用purrr使用以下命令在数据框列上迭代运行多个字符串替换gsub 功能 这是示例数据框 df lt data frame Year 2019 Text c rep a aa 5 rep a bb 3 rep a cc 2 gt df
  • 如何使用 R 计算成为列表中中位数的概率?

    假设我有以下数据集 其中显示了假设实验的每个状态的三个观察结果的列表 state lt c Iowa Minnesota Illinois outcome lt list c 5 11 11 c 3 12 8 c 9 14 2 dat lt
  • Dendextend:关于如何根据定义的组为树状图的标签着色

    我正在尝试使用一个名为 dendextend 的很棒的 R 包来绘制树状图并根据一组先前定义的组为其分支和标签着色 我已阅读您在 Stack Overflow 中的答案以及 dendextend vignette 的常见问题解答 但我仍然不
  • 尝试读取 CSV 文件时出现“无法识别的字符串转义”

    我正在尝试导入一个 csv文件 以便我可以观看此视频 R ggplot2 图形直方图 http www youtube com watch v 47kWynt3b6M 我安装了所有正确的软件包 包括ggplot以及相关的包 视频中的第一个说
  • R独特的列或行与NA无可比拟

    有谁知道如果incomparables的论证unique or duplicated 曾经被实施过incomparables FALSE 也许我不明白它应该如何工作 无论如何 我正在寻找一个巧妙的解决方案 以仅保留与另一列相同的唯一列 或行
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 以引用透明的方式从函数的省略号参数中提取符号

    事情又发生了 我正要按下发布答案按钮的问题被删除了 我正在寻找一种方法来从函数的省略号参数中提取绑定到符号的对象的值以及符号 也就是说 我试图以引用透明的方式从省略号中提取符号 我尝试过使用替代品和lazy dots 但没有成功 funct
  • 在 R 中使用 lapply 绘制多个数据帧

    我正在尝试使用 lapply 函数绘制多个数据帧 每个数据帧一个图 但是尽管有关此主题的所有帖子我都找不到答案 因为我不断收到错误 图的输出列表为空 我的数据结构如下 df1 lt mtcars gt group by cyl gt tal
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 如何在 R 中匹配多个 ggplot2 图中的调色板?

    自从被问到这个问题以来已经有一段时间了 但我知道一个事实 我很快就会提取新数据 我想弄清楚如何用这种技术来绘制它 看起来评论和答案中的人知道如何做到这一点 但我无法完全弄清楚所给我的内容 还有人想尝试一下吗 我正在尝试使用具有多个级别的因子
  • 为什么 R 更新后 sim_slopes() 中会出现此错误?

    我正在尝试使用 交互 包来创建简单斜率的约翰逊 尼曼图 但是 当尝试运行 sim slopes 函数时 出现以下错误 直到我将R更新到4 2 2 我才没有遇到这个问题 我使用的是 macOS Ventura 13 1 Error class
  • 使用 ggmap 截断密度多边形

    我在使用 R ggmap 绘制密度图时遇到问题 我的数据如下所示 gt head W date lat lon dist 1 2010 01 01 31 942 86 659 292 415 2 2010 01 10 32 970 84 1
  • ggplot2:如何标记事件发生的日期

    我想从第二个情节中获取第一个情节的信息 第二张图表示事件发生的天数 它看起来更宽 因为它没有图例 但它是相同的时间尺度 我选择在第一个图中手动分配颜色 I would like to overlay the second plot dots
  • 纵向比较 R 中的值...并进行扭转

    我有许多人在多达四个时间段进行的测试结果 这是一个示例 dat lt structure list Participant ID c A A A A B B B B C C C C phase structure c 1L 2L 3L 4L
  • 投资决策:R中的NPV、IRR、PB计算

    我正在尝试计算不同数量项目的净现值 NPV 内部收益率 IRR 和投资回收期 PB 时间 以评估哪个投资项目提供最佳回报 到目前为止 我可以为每个项目单独计算几行代码 但我想做的是 编写一个函数 它接受一个包含许多不同项目及其现金流的矩阵
  • 使用 template.docx 从 Shiny App 编织 Word 文档

    我正在尝试使用 template docx 文件从闪亮的应用程序编写一个 Word 文档 我收到以下错误消息 pandoc exe template docx openBinaryFile 不存在 没有这样的文件或目录 以下 3 个文件当前
  • 如何绘制具有显着性水平的箱线图?

    前段时间问了一个关于绘制箱线图的问题Link1 https stackoverflow com questions 14604439 plot multiple boxplot in one graph 我有一些包含 3 个不同组 或标签
  • 如何将plot中的单变量列表图表转换为ggplot2格式?

    我正在搜索 但仍然找不到一个非常简单的问题的答案 我们如何使用 R 中的 ggplot2 生成一个变量的简单线图 我正在分析时间序列数据 并且想要对图表进行更复杂的操作 我认为如果我使用 ggplot2 代替会更好plot It works

随机推荐

  • 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