我有一张用最短路径获得的表:
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)
答案 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)))))