web-dev-qa-db-ja.com

data.table(freadを使用)を使用した複数のファイルの高速読み取りと結合

同じ構造の複数の異なるtxtファイルがあります。次に、freadを使用してそれらをRに読み込み、それらを結合してより大きなデータセットにします。

## 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を使用すると、速度が非常に遅くなり、ファイルを1つずつ読み取るよりも明らかに時間がかかります。ここでどこがうまくいかなかったのでしょうか、スピードゲインの改善はありますか?

llplyパッケージのplyrを試しましたが、速度はあまり向上しません。

また、rbindunionsqlのような垂直結合を実現するdata.tableの構文はありますか?

ありがとう。

33
Bigchao

_data.table_を一緒にrbind a listするように設計されたrbindlist()を使用します...

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

そして@ Rolandが言うように、関数の各反復でキーを設定しないでください!

要約すると、これが最善です:

_l <- lapply(all.files, fread, sep=",")
dt <- rbindlist( l )
setkey( dt , ID, date )
_
45
Simon O'Hanlon