我B1
,B2
,B3
等作为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)中的错误:不是图形对象
答案 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.length
,diameter
,transitivity
和degree
都返回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>