如何在几个矩阵上执行相同的计算?

时间:2015-07-13 02:49:00

标签: r loops matrix

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等做的事情,其中​​&#34; matrices&#34;应该是igraph objetcs的列表:

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

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

1 个答案:

答案 0 :(得分:2)

要获取名为&#39; matrix1&#39;的变量,请使用get

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

然后执行所有内容,例如degree(m),...

虽然正如我在上一个问题中提到的那样,如果matrices igraph对象的列表,而不是名称列表,那会更好。对象。然后,您当前的代码将按原样运行,并且您可以使用lapply等函数。

更新:重新分配代码。

您可以采用多种方式,但常见的要素是,不要将变量存储在A1,...,A100中,而是将它们存储在列表A中,以便A[[1]]是您的老A1。

e.g。

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)。< / p>