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:
il mio suggerimento in post: trascorsi, 146.765 secondi.
@ suggerimento di Joran qui sotto: 6.902 secondi
@ 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.
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). –
@beginneR Se si guarda il file Leggimi nella pagina github, verrà visualizzato il comando per l'installazione da github. (Utilizzando il pacchetto devtools). – joran
@joran fantastico, ora l'installazione .. grazie per quel suggerimento. –