2013-03-18 46 views
5

我有一個數據集看起來像這樣列的數據幀:骨料基於無序對

 id1 id2 size 
1 5400 5505  7 
2 5033 5458  1 
3 5452 2873  24 
4 5452 5213  2 
5 5452 4242  26 
6 4823 4823  4 
7 5505 5400  11 

id1id2是在圖形獨特的節點,size是分配給一個值指導邊緣連接它們id1id2。這個數據集相當大(超過200萬行)。我想要做的是總結大小列,按照無序節點對id1id2分組。例如,在第一行中,我們有id1=5400id2=5505。數據框中存在另一行id1=5505id2=5400。在分組數據中,這兩行的大小列的總和將被添加到單個行中。換句話說,我想總結一下(無序)(id1,id2)集合中的數據。我已經找到了一種方法來使用apply這個自定義函數來檢查整個數據集中的反向列對,但是這種工作極其緩慢。有誰知道以另一種方式做到這一點的方式,或許與plyr或基礎包中的某些東西更有效?

回答

8

一種方法是創建pmaxpminid1id2的額外列,如下所示。我將在這裏使用data.table解決方案。

require(data.table) 
DT <- data.table(DF) 
# Following mnel's suggestion, g1, g2 could be used directly in by 
# and it could be even shortened by using `id1` and id2` as their names 
DT.OUT <- DT[, list(size=sum(size)), 
     by=list(id1 = pmin(id1, id2), id2 = pmax(id1, id2))] 
#  id1 id2 size 
# 1: 5400 5505 18 
# 2: 5033 5458 1 
# 3: 5452 2873 24 
# 4: 5452 5213 2 
# 5: 5452 4242 26 
# 6: 4823 4823 4 
+0

我覺得寫這幾行代替的組合物將有助於屆OP +雖然,你鍵入比我快 – statquant 2013-03-18 21:40:23

+1

您可以通過參數來創建在G1和G2。 – mnel 2013-03-18 21:40:36

+0

@ mnel,這太棒了。將進行編輯。任何想法如何刪除重複的行基於2列沒有臨時變量? – Arun 2013-03-18 21:43:36

3

的另一種方法:

R> library(igraph) 
R> DF 
    id1 id2 size 
1 5400 5505 7 
2 5033 5458 1 
3 5452 2873 24 
4 5452 5213 2 
5 5452 4242 26 
6 4823 4823 4 
7 5505 5400 11 
R> g <- graph.data.frame(DF, directed=F) 
R> g <- simplify(g, edge.attr.comb="sum", remove.loops=FALSE) 
R> DF <- get.data.frame(g) 
R> DF 
    id1 id2 size 
1 5400 5505 18 
2 5033 5458 1 
3 5452 2873 24 
4 5452 5213 2 
5 5452 4242 26 
6 4823 4823 4