比“while”循环更快的方法来查找 R 中的感染链

2024-01-02

我正在分析存储疾病模拟模型输出的数据的大型表(300 000 - 500 000 行)。在模型中,景观中的动物会感染其他动物。例如,在下图示例中,动物a1感染景观中的每一种动物,并且感染从一个动物转移到另一个动物,形成感染“链”。

在下面的示例中,我想要使用存储以下信息的表each动物(在下面的例子中,表=allanimals)并只切出有关动物的信息d2的感染链(我已经强调了d2的链为绿色),这样我就可以计算该感染链的平均栖息地价值。

虽然我的 while 循环可以工作,但是当表存储数十万行并且链有 40-100 个成员时,它就像糖蜜一样慢。

关于如何加快速度有什么想法吗?希望有一个tidyverse解决方案。我知道我的示例数据集“看起来足够快”,但我的数据确实很慢......

示意图:

以下示例数据的所需输出:

   AnimalID InfectingAnimal habitat
1        d2              d1       1
2        d1              c3       1
3        c3              c2       3
4        c2              c1       2
5        c1              b3       3
6        b3              b2       6
7        b2              b1       5
8        b1              a2       4
9        a2              a1       2
10       a1               x       1

示例代码:

library(tidyverse)

# make some data
allanimals <- structure(list(AnimalID = c("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8",
"b1", "b2", "b3", "b4", "b5", "c1", "c2", "c3", "c4", "d1", "d2", "e1", "e2",
"e3", "e4", "e5", "e6", "f1", "f2", "f3", "f4", "f5", "f6", "f7"),
InfectingAnimal = c("x", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a2", "b1",
"b2", "b3", "b4", "b3", "c1", "c2", "c3", "c3", "d1", "b1", "e1", "e2", "e3",
"e4", "e5", "e1", "f1", "f2", "f3", "f4", "f5", "f6"), habitat = c(1L, 2L, 1L,
2L, 2L, 1L, 3L, 2L, 4L, 5L, 6L, 1L, 2L, 3L, 2L, 3L, 2L, 1L, 1L, 2L, 5L, 4L,
1L, 1L, 1L, 1L, 4L, 5L, 4L, 5L, 4L, 3L)), .Names = c("AnimalID",
"InfectingAnimal", "habitat"), class = "data.frame", row.names = c(NA, -32L))

# check it out
head(allanimals)

# Start with animal I'm interested in - say, d2
Focal.Animal <- "d2"

# Make a 1-row data.frame with d2's information
Focal.Animal <- allanimals %>% 
  filter(AnimalID == Focal.Animal)

# This is the animal we start with
Focal.Animal

# Make a new data.frame to store our results of the while loop in
Chain <- Focal.Animal

# make a condition to help while loop
InfectingAnimalInTable <- TRUE

# time it 
ptm <- proc.time()

# Run loop until you find an animal that isn't in the table, then stop
while(InfectingAnimalInTable == TRUE){
    # Who is the next infecting animal?
    NextAnimal <- Chain %>% 
      slice(n()) %>% 
      select(InfectingAnimal) %>% 
      unlist()

    NextRow <- allanimals %>% 
      filter(AnimalID == NextAnimal)


    # If there is an infecting animal in the table, 
    if (nrow(NextRow) > 0) {
      # Add this to the Chain table
      Chain[(nrow(Chain)+1),] <- NextRow
      #Otherwise, if there is no infecting animal in the  table, 
      # define the Infecting animal follows, this will stop the loop.
    } else {InfectingAnimalInTable <- FALSE}
  }

proc.time() - ptm

# did it work? Check out the Chain data.frame
Chain

所以这里的问题在于你的数据结构。您将需要一个向量来存储谁被谁感染(将谁保留为整数):

allanimals_ID <- unique(c(allanimals$AnimalID, allanimals$InfectingAnimal))

infected <- rep(NA_integer_, length(allanimals_ID))
infected[match(allanimals$AnimalID, allanimals_ID)] <-
  match(allanimals$InfectingAnimal, allanimals_ID)

path <- rep(NA_integer_, length(allanimals_ID))
curOne <- match("d2", allanimals_ID)
i <- 1
while (!is.na(nextOne <- infected[curOne])) {
  path[i] <- curOne
  i <- i + 1
  curOne <- nextOne
}

allanimals[path[seq_len(i - 1)], ]

为了获得额外的性能提升,请使用 Rcpp 重新编码此循环:')

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比“while”循环更快的方法来查找 R 中的感染链 的相关文章

  • R Shinydashboard 根据选项卡选择显示/隐藏 UI 元素

    如果有人可以提供帮助 我正在努力满足要求 我必须根据用户的选项卡面板选择在仪表板侧栏上显示 隐藏一些元素 这是 UI 代码的一部分 可让您了解我的应用程序的结构 我需要仅在 tabpPanel 2 上显示 Fourthoutput Fift
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • Grails 2.0 的性能真的那么低吗?

    我对基于 JVM 堆栈的 WEB 开发有点新手 但未来的项目将特别需要一些基于 JVM 的 WEB 引擎 所以我开始寻找一些可以快速完成事情的方法 并转向尝试 Grails 从书中看 事情看起来不错 但对很长的启动时间 grails run
  • Rshinyjsshinydashboard框在radionButtons输入上展开

    基于这个问题Rshinyjsshinydashboard框在操作按钮输入时展开 https stackoverflow com questions 49659804 r shinyjs shinydashboard box uncollap
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • R Markdown 文档标题中的希腊字母

    R markdown 文档的标题中是否可以包含希腊字母 我试过这个 title Amylase author author date 8 March 2017 output pdf document keep tex true toc ye
  • 如果在循环中调用summary()命令,如何获得它的输出?

    Suppose Z是特征名称的向量 如何让以下 Rscript 中的摘要命令实际打印 for var in Z cat i form paste crim var lm fit lm form data Boston summary lm
  • 表长度运算符的性能

    卢阿有 运算符来计算用作数组的表的 长度 在诸如 C 之类的语言中 计算出某个内容的长度后 通常不会再次计算它 例如int len strlen string 这在 Lua 中有什么不同吗 其中一个的效率是否比另一个低 显然这可能不会显示显
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • 为什么删除 else 会减慢我的代码速度?

    考虑以下函数 def fact1 n if n lt 2 return 1 else return n fact1 n 1 def fact2 n if n lt 2 return 1 return n fact2 n 1 它们应该是等价的
  • 在ggplot2中绘制大多边形地图的小区域

    我有一个 shapefile 我使用它在 ggplot2 中进行了强化和绘制geom polygon 我怎样才能只绘制这张地图的一小部分区域 我的完整地图看起来不错 但我的小区域很混乱 这是一个工作示例 这个小形状文件可以从以下位置获得 h
  • javascript中如何无限循环

    我尝试使用 0 到 100 和 100 到 0 之间的 while 进行无限循环 但浏览器崩溃了 有没有办法清除浏览器内存 这是我的代码 var a 0 var flag true while true if a lt 100 flag t
  • 从 glmnet 获取变量选择顺序

    我一直在使用 glmnet R 包为一个目标变量 Y 数字 和 762 个协变量构建 LASSO 回归模型 我使用 glmnet 函数 然后coef fit s 0 056360 获取该特定 lambda 值的系数值 我现在需要的是变量选择
  • 使用 ggplot 绘制函数,相当于 curve()

    是否有使用绘制函数的等效方法ggplot to the curve 基础图形中使用的命令 我想另一种选择是创建一个函数值向量并绘制一条连接线 但我希望有更简单的东西 Thanks 您可以使用以下命令添加曲线stat function ggp
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • 如何根据值扩展数据框? [复制]

    这个问题在这里已经有答案了 我有以下输入数据框 df lt data frame x c a b c y c 4 5 6 from c 1 2 3 to c 2 4 6 df x y from to 1 a 4 1 2 2 b 5 2 4
  • 如何测试字符串中的前三个字符是r中的字母还是数字?

    下面给出了我拥有的数据集的示例 请注意 总数据集中我有超过两列 ID X 1 MJF34 2 GA249D 3 DEW235R 4 4SDFR3 5 DAS3 我想测试 X 中的前三个字符是否是字母 如果是 那么我想替换该值以仅显示前三个字
  • 直接来自数据的马尔可夫模型图(makovchain 或 deemod 包?)

    我想读取一堆因子数据并从中创建一个可以很好地可视化的转换矩阵 我发现了一个非常好的软件包 称为 heemod 它与 diagram 一起工作得不错 对于我的第一个快速而肮脏的方法 我运行了一段 Python 代码来获取矩阵 然后使用这个 R
  • IEnumerable.比带中断的 for 循环更快吗?

    我们的代码打开表单时遇到了一些缓慢的情况 这可能是由于for循环与break这需要很长时间才能执行 我把它切换到IEnumerable Any 并看到表格很快打开 我现在试图弄清楚是否单独进行此更改会提高性能 或者是否正在访问Product
  • 闪亮的本地部署错误:输入字符串 1 无效 UTF-8

    我很惊讶地发现一个突然的错误 我的 ShinyApp 停止工作并出现未知错误 提示 输入字符串 1 无效 UTF 8 即使在昨天 该应用程序也可以正常运行 但是突然停止了 下面是我运行时的错误描述runApp gt runApp Liste

随机推荐

  • 是否可以在管理面板中限制模型的对象创建?

    我只是想知道是否可以在管理面板中限制模型的对象数量 例如 我有一个名为 主页 的模型 在管理面板中我不希望用户可以创建多个主页实例 我有办法做到这一点吗 如果您只想影响管理员 并且不想影响数据库模型 则可以创建自定义 ModelAdmin
  • 无法从我的 App Engine 访问 Google Cloud SQL 数据库

    上周我尝试为 NodeJS API 和 Cloud SQL 数据库设置 Google Cloud 总体而言 它工作正常 但我无法访问我的 Cloud SQL 数据库 SQL数据库的授权表明当前项目内的所有应用都有权访问该数据库 不幸的是 事
  • focusout 事件后未触发单击事件

    Focusout事件之后 不再触发click事件 我的设计是
  • 创建 torrent 哈希信息

    如何在 torrent 文件上生成 torrent 哈希信息 我一直在看这个例子 如何使用 Java 计算 torrent 的哈希值 https stackoverflow com questions 3436823 how to calc
  • Mac OS X 雪豹上的 ant 默认安装在哪里?

    我没有设置ANT HOME 所以我想找到ant的主目录在哪里 我使用的是 OSX 安装中默认安装的 ant 版本 按照以下说明查找任何包的位置 whereis ant replace ant with whatever you re loo
  • 解析时 JSON 中位置 608 处出现意外字符串

    我正在尝试将我的 React 网站托管到 GitHub 但是当我尝试使用时 npm install save gh pages 我收到以下错误 Failed to parse json npm ERR JSON parse Unexpect
  • 为什么我的 Tkinter 饼图不显示?

    我正在构建一个应用程序 它接受输入 将其保存到 CSV 文件 现在最后一个基本部分是显示列内容的饼图 输入应该是关于书籍的 因此 饼图应该显示列表中所有书籍的类型 我在创建饼图时没有问题 我在单独的脚本中管理它 我也没有收到错误消息 但只有
  • JSF 转换标题属性的日期

    我需要将日期放入图像的标题属性中 以便当用户将鼠标悬停在图像上时显示该日期 问题是我想更改日期格式 有任何想法吗
  • 在子函数中访问循环迭代?

    我正在使用 Google Maps API 在地图上绘制多个点 然而 在下面的点击事件函数中 i始终设置为 4 即迭代循环后的值 note these are actual addresses in the real page var ad
  • Android apk安装:如何清除旧版本的文件?

    当我安装新版本的 apk 时 这会覆盖旧版本而不删除它 在新版本中 我删除了一些文件 使用 NDK 生成的库 但在设备上 旧文件仍然存在 如何确保每当安装新版本时 所有旧文件都会在安装前被删除 编辑 澄清 这个问题要求为我的应用程序的现有用
  • java.io.IOException:无法获取锁定

    得到错误为 java io IOException 无法获取 log abc log 的锁定 不知道为什么会发生这种情况 有人可以帮我吗 谢谢 logger LogManager getLogManager getLogger classN
  • 在临时对象上调用成员函数时生成警告

    给定一个矩阵模板类mat
  • 从 pyparsing 获取嵌套命名结果

    我正在修改 pyparsing fourFn 示例以接受变量 评估已经有效 现在我希望能够解析字符串并输出所需变量的列表 我希望它的工作方式如下 from my module parser import FormulaParser form
  • 如何显示来自单独 NIB 的工作表

    如何将一个窗口放在一个单独的 NIB 中 给它自己的 NSWindowController 让它作为一张纸滑出 这是与床单有关的典型事情吗 我试图从主窗口显示自定义工作表 从父窗口的标题栏向下滑动的窗口 我认为我想做的是标准的 但我找不到明
  • 如何检测 C# Windows 窗体代码在 Visual Studio 中执行?

    是否有变量或预处理器常量可以让您知道代码是在 Visual Studio 上下文中执行的 Try 调试器 IsAttached http msdn microsoft com en us library system diagnostics
  • PHP 按键和值比较两个多维数组

    我正忙于学习 PHP 正在寻找一种方法来通过键和值比较两个关联数组 然后找到两者的差异 即 如果我有一个关联数组 array size 2 x15z gt int 12 length 2 x16z gt int 3 length 1 另一个
  • fsevents 导致模块解析失败:意外字符“�”

    我在用next js我得到 Failed to compile node modules fsevents fsevents node 1 0 Module parse failed Unexpected character 1 0 You
  • 无法使用 xpath 获取 YouTube 视频的持续时间

    我想写一些东西来返回 YouTube 链接的视频持续时间 所以我发现requests and lxml并开始遵循this http docs python guide org en latest scenarios scrape guide
  • 使用 HTML 和 CSS 的可折叠列表

    我有一个使用 HTML 和 CSS 实现的可折叠列表 该列表工作正常 但我需要一些修改 每当我单击列表中的某个项目时 它就会展开 但是 当我单击同一列表中的另一项时 先前展开的元素会折叠 而单击的元素会展开 请帮助我应用可以同时展开多个列表
  • 比“while”循环更快的方法来查找 R 中的感染链

    我正在分析存储疾病模拟模型输出的数据的大型表 300 000 500 000 行 在模型中 景观中的动物会感染其他动物 例如 在下图示例中 动物a1感染景观中的每一种动物 并且感染从一个动物转移到另一个动物 形成感染 链 在下面的示例中 我