2014-05-20 12 views
7

Ho un dataframe molto grande (265,874 x 30), con tre gruppi sensibili: una categoria di età (1-6), date (5479 tali) e geografica località (4 totale). Ogni record consiste in una scelta tra ognuna di queste, oltre a 27 variabili di conteggio. Voglio raggruppare per ciascuna delle variabili di raggruppamento, quindi prendere un collSum sulle risultanti variabili sottogruppo 27. Ho cercato di usare dplyr (v0.2) per farlo, perché farlo manualmente finisce per impostare un sacco di cose ridondanti (o ricorrere ad un ciclo per iterare attraverso le opzioni di raggruppamento, per mancanza di un elegante soluzione).dplyr: colSums su frame di dati sottogruppo (group_by): elegante

Codice Esempio:

countData <- sample(0:10, 2000, replace = TRUE) 
dates <- sample(seq(as.Date("2010/1/1"), as.Date("2010/01/30"), "days"), 200, replace = TRUE) 
locality <- sample(1:2, 2000, replace = TRUE) 
ageCat <- sample(1:2, 2000, replace = TRUE) 
sampleDF <- data.frame(dates, locality, ageCat, matrix(countData, nrow = 200, ncol = 10)) 

poi quello che mi piacerebbe fare è ...

library("dplyr") 
sampleDF %.% group_by(locality, ageCat, dates) %.% do(colSums(.[, -(1:3)])) 

, ma questo non funziona del tutto, in quanto i risultati di colSums() non sono frame di dati. Se lo getto, funziona:

sampleDF %.% group_by(locality, ageCat, dates) %.% do(data.frame(matrix(colSums(.[, -(1:3)]), nrow = 1, ncol = 10))) 

ma il bit di fine (...) sembra molto goffo.

Qualche idea su come farlo in modo più elegante o efficace? Credo che la domanda dipenda da: il modo migliore per usare la funzione do() e il. operatore per riassumere un frame di dati tramite colSums.

Nota: il fai operatore applica solo alle dplyr 0.2, quindi è necessario afferrarla da GitHub (link), non da CRAN (.).

Modifica: i risultati di suggerimenti

tre soluzioni:

  1. il mio suggerimento in post: trascorsi, 146.765 secondi.

  2. @ suggerimento di Joran qui sotto: 6.902 secondi

  3. @ suggerimento di Eddi nei commenti, utilizzando data.table: 6.715 secondi.

Non mi sono preoccupato di replicare, ho appena usato system.time() per ottenere uno scartamento grezzo. Dagli sguardi, dplyr e data.table eseguono approssimativamente lo stesso sul mio set di dati, ed entrambi sono significativamente più veloci se usati correttamente rispetto alla soluzione di hacking che mi è venuta in mente ieri.

+0

Ti dispiacerebbe condividere un collegamento a dove esattamente Dplyr 0.2 può essere scaricato? Lo apprezzerei dato che non ho trovato il download su GitHub (e potrebbe rendere più semplice per gli altri membri della comunità rispondere alla tua domanda). –

+0

@beginneR Se si guarda il file Leggimi nella pagina github, verrà visualizzato il comando per l'installazione da github. (Utilizzando il pacchetto devtools). – joran

+0

@joran fantastico, ora l'installazione .. grazie per quel suggerimento. –

risposta

8

A meno che non mi manca qualcosa, questo sembra come un lavoro per summarise_each (una sorta di colwise analogico dal plyr):

sampleDF %.% group_by(locality, ageCat, dates) %.% summarise_each(funs(sum)) 

La colonna di raggruppamento non sono inclusi nella funzione riassuntiva di default, e puoi selezionare solo un sottoinsieme di colonne per applicare le funzioni utilizzando la stessa tecnica di quando usi select.

(summarise_each è nella versione 0.2 di dplyr ma non in 0.1.3, per quanto ne so.)

+0

Mi era mancato summarise_each: grazie per il suggerimento! È molto più veloce che lanciare ripetutamente, come mostra la modifica sul mio post originale. –

Problemi correlati