Vorrei aggregare uno data.frame
con una variabile identificativa chiamata ensg
. Il frame di dati è simile al seguente:Modo elegante per risolvere il task ddply con aggregato (sperando in prestazioni migliori)
chromosome probeset ensg symbol XXA_00 XXA_36 XXB_00
1 X 4938842 ENSMUSG00000000003 Pbsn 4.796123 4.737717 5.326664
voglio calcolare la media per ogni colonna numerica su righe con lo stesso valore ensg
. Il problema qui è che mi piacerebbe lasciare intatte le altre variabili di identità cromosomiche e simboli poiché sono uguali per lo stesso ensg
.
Alla fine vorrebbe avere un data.frame
con colonne di identità chromosome
, ensg
, symbol
e media di colonne numeriche su righe con stesso identificatore. Ho implementato questo in ddply
, ma è molto lento rispetto al aggregate
:
spec.mean <- function(eset.piece)
{
cbind(eset.piece[1,-numeric.columns],t(colMeans(eset.piece[,numeric.columns])))
}
t
mean.eset <- ddply(eset.consensus.grand,.(ensg),spec.mean,.progress="tk")
La mia prima implementazione aggregato si presenta così,
mean.eset=aggregate(eset[,numeric.columns], by=list(eset$ensg), FUN=mean, na.rm=TRUE);
ed è molto più veloce. Ma il problema con aggregate
è che devo ricollegare le variabili descrittive. Non ho capito come utilizzare la mia funzione personalizzata con aggregate
poiché aggregate
non passa i frame di dati ma solo i vettori.
C'è un modo elegante per farlo con aggregate
? O c'è un modo più veloce per farlo con ddply
?
Grazie per questa bellissima soluzione! È anche fulmineo rispetto a ddply. Non sapevo della potenza dell'interfaccia formula! Ho usato R per un paio di mesi, ma continua a sorprendermi (in senso buono). In modo imbarazzante, mi manca ancora la reputazione di votare la soluzione ... – Johannes
@Johannes: FWIW, l'interfaccia della formula è più lenta delle altre. –
Ora ho adattato la soluzione postata [qui] (http://stackoverflow.com/a/3685919/1093951) di Hadley.Si basa sulla conversione dei dati in una matrice prima di applicare la media che porta ad un enorme aumento di velocità. Con il mio set di dati di dimensioni 10^5 x 43 la velocità aumenta di un fattore di 25! – Johannes