paquete - Lectura rápida y combinación de varios archivos usando data.table(con fread)
render dt r (1)
Tengo varios archivos de texto diferentes con la misma estructura. Ahora quiero leerlos en R usando fread, y luego unirlos en un conjunto de datos más grande.
## First put all file names into a list
library(data.table)
all.files <- list.files(path = "C:/Users",pattern = ".txt")
## Read data using fread
readdata <- function(fn){
dt_temp <- fread(fn, sep=",")
keycols <- c("ID", "date")
setkeyv(dt_temp,keycols) # Notice there''s a "v" after setkey with multiple keys
return(dt_temp)
}
# then using
mylist <- lapply(all.files, readdata)
mydata <- do.call(''rbind'',mylist)
El código funciona bien, pero la velocidad no es satisfactoria. Cada archivo txt tiene 1M observaciones y 12 campos.
Si uso el fread
para leer un solo archivo, es rápido. Pero al usar apply
, la velocidad es extremadamente lenta, y obviamente toma mucho tiempo que leer los archivos uno por uno. Me pregunto dónde salió mal aquí, ¿hay alguna mejora para la ganancia de velocidad?
plyr
paquete llply
en plyr
, no hay muchas ganancias de velocidad.
Además, ¿hay alguna sintaxis en data.table
para lograr una unión vertical como rbind
y union
en sql
?
Gracias.
Use rbindlist()
que está diseñado para rbind
una list
de data.table
''s together ...
mylist <- lapply(all.files, readdata)
mydata <- rbindlist( mylist )
Y como dice @Roland , ¡no establezca la clave en cada iteración de su función!
Así que en resumen, esto es lo mejor:
l <- lapply(all.files, fread, sep=",")
dt <- rbindlist( l )
setkey( dt , ID, date )