Подтвердить что ты не робот

Быстрое чтение и объединение нескольких файлов с использованием data.table(с fread)

У меня есть несколько разных txt файлов с одинаковой структурой. Теперь я хочу прочитать их в R, используя fread, а затем объединить их в более крупный набор данных.

## 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 a "v" after setkey with multiple keys
    return(dt_temp)

}
# then using 
mylist <- lapply(all.files, readdata)
mydata <- do.call('rbind',mylist)

Код работает нормально, но скорость не является удовлетворительной. Каждый txt файл имеет 1M наблюдений и 12 полей.

Если я использую fread для чтения одного файла, это быстро. Но используя apply, скорость очень медленная и, очевидно, занимает много времени, чем чтение файлов по одному. Интересно, где пошло не так, есть ли улучшения для увеличения скорости?

Я попробовал пакет llply в plyr, выигрыши в скорости не так много.

Кроме того, существует ли какой-либо синтаксис в data.table для достижения вертикального соединения, например rbind и union в sql?

Спасибо.

4b9b3361

Ответ 1

Используйте rbindlist(), который предназначен для rbind a list of data.table вместе...

mylist <- lapply(all.files, readdata)
mydata <- rbindlist( mylist )

И как говорит @Roland, не устанавливайте ключ на каждой итерации вашей функции!

Итак, это лучше всего:

l <- lapply(all.files, fread, sep=",")
dt <- rbindlist( l )
setkey( dt , ID, date )