Continuando con la respuesta de Joshua, hay una solución si desea acelerar esta operación. Está inspirado en la ideología Map-reduce y hace un tiempo hice un POC en un conjunto de datos de muestra.
Utilicé la biblioteca de nevadas: creo que también se puede trabajar con doMC.
# On my phone, please pardon typos/bugs
test <- data.frame(x=1:1000000, y=rep(c(1:20), 500))
testList = list()
testList[[1]] <- test[c(1:250000),]
testList[[2]] <- test[c(250001:500000),]
testList[[3]] <- test[c(500001:750000),]
testList[[4]] <- test[c(750001:1000000),]
# Write a function for the above - Need to find optimum number of splits
sfInit(parallel = TRUE, cpus=4)
sfCluster(plyr)
meanList = sfClusterSpplyLB(testList, function(x) ddply(test, "y", mean))
sfStop()
aggregate(meanList, by=list(y), FUN=mean)
Esta fuerza ayuda que, teniendo en cuenta que ahora estamos haciendo la rutina dividida combinar de una forma distribuida. Esto funciona para los medios cuando el tamaño de las divisiones es el mismo, funciona para sumas, mín./Máx., Recuento, etc. están bien, pero hay algunas operaciones para las que no podemos usar esto.
Dependiendo de los cálculos reales que está realizando, el paquete 'data.table' realmente podría acelerarlos. A pesar de todas sus virtudes, la implementación 'split-apply-combine' en el paquete 'plyr' es realmente bastante lenta, mientras que' data.table' está diseñado principalmente para la velocidad. (Si está intrigado, busque SO para algo como '[r] [data.table] plyr' para obtener muchos puntos de inicio posibles). –
Gracias Josh, voy a echar un vistazo. – Alex