对于大型数据集,在 R 中从索引切换到列表中的名称(或其他属性).(iGraph)



我正在使用R中的图形对象(igraph包)。 我应用了一个名为"get.shortest.paths()"的函数,它提供了从给定顶点到图形中所有其他顶点的最短路径。该算法返回一个列表,其中列表的每个元素对应于一个目标顶点,并包含源和目标之间最短路径上所有顶点的顶点索引。例如;

head(get.shortest.paths(graph, from = V(graph)[1], to = V(graph), mode = "out"))
[[1]]
[1] 0 (source and target are the same)
[[2]]
[1]     0 91835 38405 89704     1
[[3]]
[1]     0 91835 12104 39002 22670     2
[[4]]
[1]     0 62386 36754 89246 31045     3

问题是当我想从顶点索引转到顶点名称时。 像这样的东西;

[[1]]
[1] "gene 1"
[[2]]
[1]     "gene 1"  "protein 45" "protein 83" "protein 70"     "gene 2"
[[3]]
[1]     "gene 1" "protein 45" "protein 30"  "reaction 2" "protein 404"     "gene 3"
[[4]]
[1]     "gene 1" "protein 4" "reaction 12" "protein 19"  "protein 494"   "gene 4"

我尝试使用 lapply() 来做到这一点

path.index.list <-  get.shortest.paths(graph, from = V(graph)[1], to = V(cn), mode = "out")
path.name.list <- lapply(path.index.list, FUN = function(path) V(graph)[path]$name)

。但这需要很长时间。 "for"循环需要同样长的时间。 事实上,我需要从一个源顶点到所有其他 100,000+ 顶点的索引到名称的确切时间是......

system.time(lapply(path.index.list, FUN = function(path) V(graph)[path]$name))
  user  system elapsed
608.62  152.69  761.66

。整个图表大约需要 900 天。

这是"按引用传递"与"按值传递"问题之一吗,如果是这样,有人可以帮助我了解如何解决它吗? 我听说过在 R 中使用哈希或环境函数来解决这样的事情,任何人都可以对此发表评论吗? 我还听说过 R 中的一些包可以帮助解决这个问题?

基本上,如何在不必用 C 编码的情况下解决这个问题?

预先查询顶点的名称,并在lapply中索引:

names <- V(graph)$name
lapply(path.index.list, FUN = function(path) names[path])

我想这会快得多,因为lapply不必每次都构建V(graph)和名称列表,只是为了选择它的子列表。

是的,我最初使用的是使用"Tamás"描述的lapply方法。 我每次迭代大约 230 秒(每 2 个项目大约 1000 秒)。 我尝试使用"快速匹配"包与使用矩阵的内存分配相结合,速度实际上下降了。 我认为这意味着这更多的是R查找项目的速度而不是内存的问题。 我需要将其减少到每次迭代不到 6 秒,这实际上是实用的。 我想我要去C...

最新更新