2014-03-27 145 views
0

我有最短路径与得到的表:基于列名称如何选择一个矩阵列

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行的矩阵和相同的数量的长度的列(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

请提供一个可重复的例子。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

谢谢你,为了复制这些代码,你只需要创建一个新的图像g:g < -barabasi.game(200) – user299791

+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)))))