如何将列表上的矩阵循环转换为列表上的igraph?

时间:2019-01-07 01:06:03

标签: r for-loop igraph network-analysis

当我通过函数“ graph.incidence”使用R的for循环将列表中的许多元素(每个元素都是矩阵)同时转换为igraph个对象时,将使用并执行以下代码:

storage2 <- list()
count_1 <- 1

for (i in 1:57) {
    storage2[[count_1]] <-  graph.incidence(storage1[[i]], mode = c("all"))
    count_1 = count_1 + 1
} 

但是,当我检查“ storage2”列表时,会弹出错误消息:

  

if(is.na(no))no <-len错误:参数长度为零

我该如何解决这个问题?如何将列表中的矩阵循环转换为列表中的igraph

1 个答案:

答案 0 :(得分:0)

此解决方案使用列表内的矩阵制作图形。也许您可以避免循环。我在下面提供了一个使用lapply()和一个循环的代码示例。

请注意,您的循环具有两个计数器:icount_1。对于上面的示例,您不需要两者都需要,

for (i in 1:57) {
    storage2[[i]] <-  graph.incidence(storage1[[i]], mode = c("all"))
}

完整的代码示例将很有用,但是我认为您应该验证storage1确实包含正确的矩阵。

如果确实需要循环,那么使用计数器的方法值得称赞。如果将您追加到循环内的列表中,storage2 <- c(storage2, graph.incidence(...)会变得不那么整洁,并且可能会更慢,因为c()在每次迭代时都会复制整个列表,从而导致执行时间成倍增长。

我希望这段代码可以帮助您前进。

# Some setup
library(igraph)
dimensions <- 10
networks <- 5

# Example data of a list of random matreces:
storage1 <- lapply(1:networks, function(x) m <- matrix(sample(c(0,1), dimensions^2, replace=T), nrow=dimensions))

# lapply()-solution: Make networks from each list-item in storage1
storage2 <- lapply(storage1, 'graph.incidence')

# forloop-solution: Since you specifically want to do it in a for-loop, this is one way to achieve that
storage3 <- list()
for(m in storage1){
  storage3[[length(storage3) + 1]] <- graph.incidence(m)
}

# A quick test to see that the lapply-solution in storage2 is the same
# as the loop-solution in storage3
lapply(1:length(storage2), function(x) E(storage2[[x]]) == E(storage3[[x]]) )