2013-03-18 12 views
5

Ho un insieme di dati che assomiglia a questo:aggregare un frame di dati basato su coppia non ordinata di colonne

 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 

Dove id1 e id2 sono nodi unici in un grafico, e size è un valore assegnato al diretto bordo collegandoli daid1aid2. Questo set di dati è abbastanza grande (poco più di 2 milioni di righe). Quello che vorrei fare è sommare la colonna della dimensione, raggruppata per coppie di nodi non ordinati di id1 e id2. Ad esempio, nella prima riga, abbiamo id1=5400 e id2=5505. Esiste un'altra riga nel frame dei dati dove id1=5505 e id2=5400. Nei dati raggruppati, la somma delle colonne delle dimensioni per queste due righe verrebbe aggiunta a una singola riga. Quindi, in altre parole, voglio riassumere i dati su cui sto raggruppando un insieme (non ordinato) di (id1, id2). Ho trovato un modo per farlo usando apply con una funzione personalizzata che controlla la coppia di colonne invertita nel set di dati completo, ma questo funziona atrocemente lento. Qualcuno sa di un modo per farlo in un altro modo, forse con plyr o con qualcosa nei pacchetti di base che sarebbe più efficiente?

risposta

8

Un modo è creare colonne aggiuntive con pmax e pmin di id1 e id2 come segue. Userò la soluzione data.table qui.

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

Credo che scrivere su diverse linee, invece composizioni sarebbero aiutare ° OP +, però, si digita più veloce di me – statquant

+1

è possibile creare G1 e G2 in per argomento. – mnel

+0

@mnel, è geniale. Farà la modifica. Qualche idea su come rimuovere le righe duplicate in base a 2 colonne senza una variabile temporanea? – Arun

3

un metodo alternativo:

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 
Problemi correlati