- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2019-04-07T03:29:28+00:00","","")
#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]
#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=",")
}
}}
** data.table インストール [#tb618176]
fread を使用した場合のパフォーマンスも図ってみたいので data.table をインストールしておく。
#myterm2(){{
install.packages("data.table")
}}
#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>)