#mynavi(R言語入門) #setlinebreak(on); * 目次 [#x72f200f] #contents - 関連 -- [[R言語入門]] * 概要 [#f9f05c92] #html(<div style="padding-left: 20px;">) ディレクトリ配下のcsvを1つのデータフレームに読み込む場合のパフォーマンス比較。 #html(</div>) * 準備 [#y731e85e] #html(<div style="padding-left: 20px;">) ** テストデータ作成 [#ccdf8b16] #html(<div style="padding-left: 20px;">) #myterm2(){{ # データ格納用ディレクトリ作成 system("mkdir csv") # 1000件のデータを保持するファイルを1000個作成 for (i in 1:1000) { df <- data.frame(no=1:1000, x=rnorm(1000), y=rnorm(1000)) filename <- paste("csv/test", i, ".csv", sep="") write.table(df, filename, quote=F, col.names=T, row.names=F, sep=",") } }} #html(</div>) ** data.table インストール [#tb618176] #html(<div style="padding-left: 20px;">) fread を使用した場合のパフォーマンスも図ってみるので data.table をインストールしておく。 fread を使用した場合のパフォーマンスも図ってみたいので data.table をインストールしておく。 #myterm2(){{ install.packages("data.table") }} #html(</div>) #html(</div>) * 処理の作成 [#r3a3bc32] #html(<div style="padding-left: 20px;">) ** 普通にファイル数分ループして rbind する [#r073cd3d] #html(<div style="padding-left: 20px;">) read_csv_normal.R #mycode2(){{ files <- list.files("csv", full.names = T) df <- data.frame() for (f in files) { data <- read.table(f, sep=",", header=T) df <- rbind(df, data) } cat("read count:", nrow(df), "\n") }} #html(</div>) ** 繰り返し処理を lapply と do.call に変更する [#ndfe7df4] #html(<div style="padding-left: 20px;">) read_csv_apply1.R #mycode2(){{ files <- list.files("csv", full.names = T) df <- do.call(rbind, lapply(files, read.table, sep=",", header = T)) cat("read count:", nrow(df), "\n") }} #html(</div>) ** さらに読み込み自体を data.table の fread に変える場合 [#y4fd2f58] #html(<div style="padding-left: 20px;">) read_csv_apply2.R #mycode2(){{ library("data.table") files <- list.files("csv", full.names = T) df <- do.call(rbind, lapply(files, fread, sep=",", data.table = F)) cat("read count:", nrow(df), "\n") }} #html(</div>) #html(</div>) * 結果 [#q6ceafb3] #html(<div style="padding-left: 20px;">) #myterm2(){{ > system.time(source("read_csv_normal.R")) read count: 1000000 ユーザ システム 経過 22.317 5.798 28.126 > system.time(source("read_csv_apply1.R")) read count: 1000000 ユーザ システム 経過 3.133 0.131 3.265 > system.time(source("read_csv_apply2.R")) read count: 1000000 ユーザ システム 経過 0.752 0.127 0.879 }} lapply と do.call を使えば 1/8 ぐらいにはなる。 さらに fread を使用すれば 1/30 にまで短縮。 機会があればマシンリソースの消費具合も測ってみたい。 #html(</div>)