10

次のようなデータセットがあります。

     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

ここで、id1およびはid2グラフ内の一意のノードであり、それらをからに接続する有向エッジsizeに割り当てられた値です。このデータセットはかなり大きいです(200万行強)。私がやりたいのは、との順序付けられていないノードのペアでグループ化されたサイズ列を合計することです。たとえば、最初の行にはとがあります。データフレームに別の行があり、ここでと。グループ化されたデータでは、これら2つの行のサイズ列の合計が1つの行に追加されます。つまり、(id1、id2)の(順序付けされていない)セットでグループ化しているデータを要約したいと思います。私はこれを使用してこれを行う方法を見つけました id1 id2id1id2id1=5400id2=5505id1=5505id2=5400apply完全なデータセットの逆の列ペアをチェックするカスタム関数を使用しますが、これは非常に低速で動作します。誰かがこれを別の方法で行う方法を知っていますか?おそらく、plyrより効率的な基本パッケージの何かを使って、またはそれを使って。

4

2 に答える 2

12

1つの方法は、次のようにandofとpmaxandpminを使用して追加の列を作成することです。ここではソリューションを使用します。id1id2data.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
于 2013-03-18T21:37:04.417 に答える
7

別の方法:

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
于 2013-04-20T21:10:31.373 に答える