【问题标题】:How to perform same calculations over several matrices?如何对多个矩阵执行相同的计算?
【发布时间】:2015-07-13 02:48:59
【问题描述】:

我将B1B2B3 等作为igraph 对象。

这是我的代码:

setwd("D:\\Educacion\\PeerEffects\\matriz de contactos\\Intentos\\")
filenames <- list.files(path=getwd(),pattern="matriz+.*dta")
list(filenames)
names <-substr(filenames,1,7)
for(i in names) 
  {
  filepath <- file.path("D:/Educacion/PeerEffects/matriz de contactos/Intentos",paste(i,".dta",sep=""))
  assign(i, read.dta(filepath))
}

for (i in 1:length(names)){
  assign(paste0("A", i), unname(as.matrix(get(paste0("matriz", i)))))
  assign(paste0("B", i), graph.adjacency(get(paste0("A", i)), mode = "directed", weighted = NULL, diag = FALSE))
}

这是我需要对每个 igraph objetc B1、B2 等执行的操作,其中“矩阵”应该是 igraph objetcs 的列表:

for (i in matrices) {
  average.path.length(i)
  diameter(i)
  transitivity(i)
  degree(i)
}

这是当矩阵是名称列表(B1、B2 等)时我得到的错误: average.path.length(i) 中的错误:不是图形对象

【问题讨论】:

  • 请将此错误添加到您的原始帖子中。此外,您的问题无法重现。
  • 老实说,目前尚不清楚您要做什么。也许您应该指定好,提供一些(可重现的)代码和所需的输出。

标签: r loops matrix


【解决方案1】:

要获取名为“matrix1”的变量,请使用get

m <- get(paste0('matrix', i))

然后做你所有的事情,比如degree(m),...

尽管正如我在上一个问题中提到的,如果 matricesigraph 对象 的列表,而不是对象的 名称 列表,那会更好.然后,您当前的代码将按原样工作,并且您将拥有像 lapply 这样的函数可供您使用。


更新:重新分配代码。

您可以通过多种方式做到这一点,但共同的元素是,不是将变量存储在 A1, ..., A100 中,而是将它们存储在列表中 A 以便 A[[1]] 是您的旧 A1。

例如

As <- lapply(names,
             function (name) {
                 filepath <- ...
                 as.matrix(read.dta(filepath)) # this is Ai
              })
# note As[[i]] is your old Ai

Bs <- lapply(As, graph.adjacency, mode="directed", weighted = NULL, diag = FALSE)
# now Bs[[i]] is your old Bi

你可以这样做,例如

avg.lengths <- lapply(Bs, average.path.length)
degree <- lapply(Bs, degree)

等等。然后对于图形i,您可以使用Bs[[i]] 获取图形,avg.lengths[[i]] 获取平均长度等。

如果average.path.lengthdiametertransitivitydegree 都返回 SINGLE 值,您可以简单地将它们存储在数据框中:

graph.properties <- data.frame(
                        graph=1:length(Bs),
                        average.path.length=sapply(Bs, average.path.length),
                        diameter=sapply(Bs, diameter),
                        ...)

那么graph.properties$diameter[i]就是Bi的直径。但是,您不能将图形本身存储在数据框中,因为数据框单元格应该只包含单个值而不是复杂的对象。

另外我认为degree 返回一个数字向量,所以你被困在一个列表而不是数据框(因此我最初使用lapply 而不是sapply)。

【讨论】:

  • 是的,我认为这是我遇到的问题。但是如何列出 igraph 对象?
  • 这完全取决于您如何创建每个matrixi-s。
  • 我编辑了我的问题并添加了代码的前面部分。请注意,我为 B1、B2 等更改了 matrix1、matrix2 等。
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多