同じ構造の複数の異なる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
を試しましたが、速度はあまり向上しません。
また、rbind
のunion
やsql
のような垂直結合を実現するdata.table
の構文はありますか?
ありがとう。
_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 )
_