2016-05-08 6 views
0

RでiGraphを使用して分析していますが、現在は非常に高価な計算を行っています。私はグラフ内のすべてのノードでそれを行う必要があるので、誰かがそれを行うより効率的な方法を知っていれば、私はそれを感謝するでしょう。クラスタ割り当てに基づくネイバーグループは遅い

グラフは、gから始めます。私は最初、私は基本的に2つのグループ今

nc <- length(c) 
assignments <- rbinom(nc, 1, .5) 

の1に、各クラスタの割り当てに続いて、グラフ上

library(igraph) 
adj_matrix <- matrix(rbinom(10 * 5, 1, 0.5), ncol = 8000, nrow = 8000) 
g <- graph_from_adjacency_matrix(adj_matrix, mode = 'undirected', diag = FALSE) 
c <- cluster_louvain(g) 

をいくつかのコミュニティの検出を行い、各ノードのために、私はそのの何パーセントを知りたいですネイバーは特定のグループに属します(クラスターの割り当てによって定義されます)。私は各行がグラフに一つの頂点に対応したデータフレームを持っていることを考えると、私は

data$pct_neighbors_1 <- sapply(1:nrow(data), 
           pct_neighbors_1, 
           graph = g, community = c, 
           assignments = assignments) 

有するすべての頂点のためにこれを行う、

pct_neighbors_1 <- function(g, vertex, c, assignments) { 
    sum(
    ifelse(
     assignments[membership(c)[neighbors(g, vertex)]] == 1, 1, 0) 
    )/length(neighbors(g, vertex)) 
} 

そして:私は現在、現在の方法でこれを行います私は物事をより効率的にすることができるここにどこかありますか?ありがとう!

+1

あなたがサンプルを提供することができますグラムhttp://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Bulat

+0

確かに、ただした。 – araspion

+0

まだビットがありません 'エラー:関数が見つかりませんでした" graph_from_adjacency_matrix " – Bulat

答えて

1

これは速くする必要があります:

library(igraph) 

# for reproducibility's sake 
set.seed(1234) 

# create a random 1000 vertices graph 
nverts <- 1000 
g <- igraph::random.graph.game(nverts,0.1,type='gnp',directed=FALSE) 

# clustering 
c <- cluster_louvain(g) 

# assignments 
nc <- length(c) 
assignments <- rbinom(nc, 1, .5) 

# precalculate if a vertex belongs to the assigned communities 
vertsInAssignments <- membership(c) %in% which(assignments==1) 

# compute probabilities 
probs <- sapply(1:vcount(g),FUN=function(i){ 
     neigh <- neighbors(g,i) 
     sum(vertsInAssignments[neigh])/length(neigh) 
}) 
関連する問題