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
。
我有一个 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
。