2015-08-24 148 views
0

我正在與R處理一個項目。該項目是給定節點之間邊緣的大數據,以測試測試邊緣是否爲真。在項目中,基本元素應該是「邊緣」,這就是我們如何判斷給定的邊緣是否真實。所以問題來了。我們創建了一個「from」節點和「to」節點兩列的數據框來表示邊,這就是edgesData,然後我們使用igraph創建了一個圖,它是。我們可以計算出相似度某兩個節點,使用如何避免R中的循環?

similarity.jaccard(graph, vids = V(graph)[edgesData[1,1], edgesData[1,2]])

但是我們怎麼能得到所有邊的桌子嗎?我試過

similarity.jaccard(graph, vids = V(graph)[edgesData[,1], edgesData[,2]])

,但沒有奏效。此外,我已經試過

similarity.jaccard(graph, vids = E(graph))

它沒有工作,要麼。一個顯而易見的方法是使用循環來從數據框中檢索每一行,但這似乎是一個糟糕的主意。所以,任何人都可以給我一些建議嗎?謝謝!

編輯: 好,好像問題是有點混亂,所以我寫了這一個循環的解決方案:

tpData <- edgesData 
simList <- c() 

while(nrow(tpData) > 0) { 
    v1 <- tpData[1,1] 
    v2 <- tpData[1,2] 
    simList <- c(simList, similarity.jaccard(graph, V(graph)[v1, v2])[1,2]) 
    tpData <- tpData[-1,] 
} 

在這個代碼中,我試圖讓兩個元素[,1] ,[,2],然後計算相似度。由於行數接近2000萬,所以需要永遠完成這項工作。有一個更好的辦法來解決這個問題。有人能幫助我嗎?謝謝。

+0

也許一個可重複的例子可以幫助嗎? – Tensibai

+1

我不知道你想要什麼,在節點(頂點)和邊緣之間計算jaccard相似度,只需輸入:'similarity.jaccard(graph)',就可以從所有節點獲得它,起來的邊緣和頂點,所以你想要什麼?你可以輸入'E(graph)'得到所有邊的列表,但是你想要什麼類型的表?同一組頂點之間是否存在多個邊?如果沒有,那麼一張桌子的邊緣會讓人感覺不到 – grrgrrbla

+0

對不起。這是我的。我有一個邊緣列表。然後我用它來創建一個圖。我想要的是,從列表中獲得每對節點的相似性。 – user3928256

回答

1

不知道這是否是最有效的方法,但我過去自己用它。這是一個簡單的例子,使用dplyr:

library(igraph) 

    g <- graph.ring(5) 

    data.frame(similarity.jaccard(g)) -> dt 

    dt 

#   X1  X2  X3  X4  X5 
# 1 1.0000000 0.0000000 0.3333333 0.3333333 0.0000000 
# 2 0.0000000 1.0000000 0.0000000 0.3333333 0.3333333 
# 3 0.3333333 0.0000000 1.0000000 0.0000000 0.3333333 
# 4 0.3333333 0.3333333 0.0000000 1.0000000 0.0000000 
# 5 0.0000000 0.3333333 0.3333333 0.0000000 1.0000000 

    library(dplyr) 

    data.frame(expand.grid(1:nrow(dt),1:ncol(dt))) %>% # combine all nodes (pairs) 
     select(node1=Var1, node2=Var2) %>%     # rename 
     group_by(node1,node2) %>%       # group in order to get each row separately 
     do(data.frame(simil = dt[.$node1,.$node2])) %>%  # pick the corresponding similarities based on the nodes' pair 
     ungroup 

# node1 node2  simil 
# 1  1  1 1.0000000 
# 2  1  2 0.0000000 
# 3  1  3 0.3333333 
# 4  1  4 0.3333333 
# 5  1  5 0.0000000 
# 6  2  1 0.0000000 
# 7  2  2 1.0000000 
# 8  2  3 0.0000000 
# 9  2  4 0.3333333 
# 10  2  5 0.3333333 
# .. ... ...  ... 
+0

感謝您的答案,但事情是,我在圖中的頂點數約爲4百萬。數據幀可以是那麼大嗎? – user3928256

+0

不知道,但肯定會讓事情變慢。如果你有特定的目標,這可以解決。例如,如果你需要得到相似度超過0.8的對,你可以減少你的組合。但是,如果您希望所有對的相似性,那麼對於4mil節點,您肯定會獲得大量數據幀。你有很多組合。 – AntoniosK

+0

感謝您的回答。問題是我沒有正確選擇數據集。 – user3928256