igraph 中的数字 POSIX 个对象

numeric POSIX objects in igraph

我有一个 POSIXct 对象矩阵

library(data.table)
p <- data.table(a=seq(from=ISOdate(2019,1,1,12,0), to=ISOdate(2019,1,2,0,0), by="hours"), b=seq(from=ISOdate(2019,2,1,12,0), to=ISOdate(2019,2,2,0,0), by="hours"))

我想对其应用 graph_from_edgelist(.)。我直接试过了

library(igraph)
g <- graph_from_edgelist(as.matrix(p[,c("a","b")]))

这很快就能完成,没有任何问题。但是,这样做会导致问题(described here),所以我尝试使用 POSIX 对象的数值转换:

p$na <- as.numeric(p$a); p$nb <- as.numeric(p$b)
g <- graph_from_edgelist(as.matrix(p[,c("na","nb")]))

然而,这让我的机器崩溃了,说 R 需要巨大的 RAM。为什么会这样?

?graph_from_edgelist 提到如果传递了一个数字矩阵,那么这些值将被视为顶点 ID。下面的例子说明:

> g <- graph_from_edgelist(matrix(c(1,10), ncol=2))
> E(g)
+ 1/1 edge from 968b115:
[1] 1->10
> V(g)
+ 10/10 vertices, from 968b115:
 [1]  1  2  3  4  5  6  7  8  9 10

虽然只有一条边,但由于传递的顶点 ID,假设有 10 个顶点。您可以从 graph_from_edgelist 的代码中看到这一点,它为数字矩阵调用 graph -- 它具有 graph(edges, n=max(edges), ...) 的形式,因此将添加到图中的顶点数等于最大您传递的 ID。

由于您的示例中有大量顶点 ID,因此 graph 命令添加了大量不需要的顶点,因此存在内存问题。根据您的需要,您可以使用 p$na <- as.character(as.numeric(...))p$na <- as.character(p$a) 等转换边,然后使用 graph_from_edgelist 或直接使用 graph_from_data_frame