Aggregieren Sie einen Datenrahmen basierend auf ungeordneten Spaltenpaaren

Ich habe einen Datensatz, der ungefähr so ​​aussieht:

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 

Dabei sind id1 und id2 eindeutige Knoten in einem Graphen, und die size ist ein Wert, der der gerichteten Kante zugeordnet ist, die sie von id1 zu id2 . Dieser Datensatz ist ziemlich groß (etwas mehr als 2 Millionen Zeilen). Was ich tun möchte, ist die Summenspalte, gruppiert nach ungeordneten Knotenpaaren von id1 und id2 . Zum Beispiel haben wir in der ersten Zeile id1=5400 und id2=5505 . Es gibt eine andere Zeile in dem id1=5505 wo id1=5505 und id2=5400 . In den gruppierten Daten würde die Summe der Größenspalten für diese zwei Zeilen zu einer einzelnen Zeile hinzugefügt. Mit anderen Worten, ich möchte die Daten zusammenfassen, in denen ich eine (ungeordnete) Menge von (id1, id2) gruppiere. Ich habe einen Weg gefunden, dies mit einer benutzerdefinierten function zu tun, die nach dem umgekehrten Spaltenpaar in der vollständigen Datei sucht, aber das funktioniert unerträglich langsam. Kennt jemand einen Weg, dies plyr zu machen, vielleicht mit plyr oder mit etwas in den plyr , das effizienter wäre?

   

Eine Möglichkeit besteht darin, zusätzliche Spalten mit pmax und pmin von id1 und id2 wie folgt zu erzeugen. Ich werde hier data.table Lösung verwenden.

 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 

eine alternative Methode:

 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 

Meine Methode mit aggregate{stats} -function:

 > 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 > df[1:2] < - t(apply(df[1:2], 1, sort)) > aggregate(size ~ id1 + id2, data=df, FUN=sum) id1 id2 size 1 4823 4823 4 2 2873 5452 24 3 4242 5452 26 4 5213 5452 2 5 5033 5458 1 6 5400 5505 18