2014-01-16 121 views
22

我有幾個不同的txt文件具有相同的結構。現在我想用fread將它們讀入R,然後將它們合併成一個更大的數據集。使用data.table快速讀取和合並幾個文件(與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's 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,那麼速度非常慢,顯然比逐個讀取文件要花費很多時間。我想知道這裏出了什麼問題,速度增益有沒有提高?

我在plyr包中試過llply,沒有太多的速度增益。

另外,是否有任何語法data.table實現垂直連接如rbindunionsql

謝謝。

+0

當然,這已經是修改的typo..I've。感謝西蒙! – Bigchao

+0

刪除了評論和更新的答案。 –

回答

34

使用rbindlist()其目的是rbinddata.table的共同的list ...

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

而作爲@Roland說,不設置鍵的功能,每次迭代!

因此,在總結,這是最好的:

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

另外,設置它們只在最後鍵一次。 – Roland

+0

@羅蘭好點。 –

+0

@ SimonO'Hanlon,非常感謝。 for循環比lapply更快嗎? – Bigchao