如何根据列名选择矩阵列

时间:2014-03-27 10:43:25

标签: r matrix igraph

我有一张用最短路径获得的表:

g<-barabasi.game(200)
geodesic.distr <- table(shortest.paths(g))
geodesic.distr
#   0    1    2    3    4    5    6    7 
# 117  298 3002 2478 3342 3624  800   28 

然后我构建一个矩阵,其中包含100行和与length相同的列数(geodesic.distr):

geo<-matrix(0, nrow=100, ncol=length(unlist(labels(geodesic.distr))))
colnames(geo) <- unlist(labels(geodesic.distr))

现在我运行了100个实验,我用

创建了基于附件的优先网络
for(i in seq(1:100)){
    bar <- barabasi.game(vcount(g))
    geodesic.distr <- table(shortest.paths(bar))
    distance <- unlist(labels(geodesic.distr))
    for(ii in distance){
        geo[i,ii]<-WHAT HERE?
    }
}

对于每个实验,我想在矩阵中存储我找到的路径数。

我的问题是:如何根据列名选择正确的列?在我的情况下,模拟网络生成的某些名称可能不会出现在原始名称中,所以我不需要只能按名称找到正确的列,但也是最接近的列(假设我的最大值为7,我最终可能会得到长度为9的路径,这个路径在地理矩阵中不存在,所以我想将它添加到列名为7)

1 个答案:

答案 0 :(得分:1)

您的方法实际上存在问题。 geodesic.distr表的长度是随机的,您正在分配矩阵以基于单次运行存储100个实现。如果100次运行之一会给你一个更长的geodesic.distr向量怎么办?我假设你想在这种情况下使分配的矩阵更大。或者,更好的是,您希望首先运行100个实现,并在知道其大小后分配矩阵。

另一个潜在的问题是,如果你做table(shortest.paths(bar)),那么你(默认情况下)考虑无向距离,将以对称矩阵结束并计算所有距离(期望自我距离)两次。这可能是也可能不是你想要的。

无论如何,这是一个简单的方法,在100次运行后分配矩阵:

dists <- lapply(1:100, function(x) {
  bar <- barabasi.game(vcount(g))
  table(shortest.paths(bar))
})
maxlen <- max(sapply(dists, length))
geo <- t(sapply(dists, function(d) c(d, rep(0, maxlen-length(d)))))