Tengo una lista de marcos de datos para los que estoy seguro de que todos contienen al menos una fila (de hecho, algunos contienen solo una fila, y otros contienen un número dado de filas), y que todos tienen las mismas columnas (nombres y tipos). En caso de que importe, también estoy seguro de que no hay NA en ninguna parte de las filas.Rendimiento de rbind.data.frame
La situación se pueden simular de esta manera:
#create one row
onerowdfr<-do.call(data.frame, c(list(), rnorm(100) , lapply(sample(letters[1:2], 100, replace=TRUE), function(x){factor(x, levels=letters[1:2])})))
colnames(onerowdfr)<-c(paste("cnt", 1:100, sep=""), paste("cat", 1:100, sep=""))
#reuse it in a list
someParts<-lapply(rbinom(200, 1, 14/200)*6+1, function(reps){onerowdfr[rep(1, reps),]})
he establecido los parámetros (de la asignación al azar) para que se aproximan a mi verdadera situación.
Ahora, quiero unir todos estos dataframes en un solo marco de datos. Pensé usando rbind haría el truco, así:
system.time(
result<-do.call(rbind, someParts)
)
Ahora, en mi sistema (que no es particularmente lento), y con los ajustes anteriores, esta toma es la salida del system.time:
user system elapsed
5.61 0.00 5.62
Casi 6 segundos para rbind-ing 254 (en mi caso) filas de 200 variables? Seguramente tiene que haber una manera de mejorar el rendimiento aquí? En mi código, tengo que hacer cosas similares muy a menudo (es una imputación múltiple), así que necesito que esto sea lo más rápido posible.
En mi trabajo, combiné una lista de marcos de datos usando una técnica de Dominik aquí http://stackoverflow.com/questions/7224938/can-i-rbind-be-parallelized-in-r/8071176#8071176 que es relativamente más rápido que do.call cuanto más grande es, y encontré un rendimiento aún mejor cuando leo los datos de la lista original con caracteres en lugar de factores. Usar rbind pasó mucho tiempo en el juego; Estoy especulando que es para verificar los niveles de factores para agregar. – ARobertson