2014-03-27 55 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)))))