sample.csv は 17035201 行の CSV ファイルである。最初の 7 行は以下のようになっている。
"id","label","label2"
1,"aaa","あああ"
2,"aaa","いいい"
3,"bbb","ううう"
4,"bbb","えええ"
5,"ccc","おおお"
6,"ccc","かかか"
これを入力とし,以下のように変更を加え出力する。
"id","new_label"
1,"aaa_あああ"
2,"aaa_いいい"
3,"bbb_ううう"
4,"bbb_えええ"
5,"ccc_おおお"
6,"ccc_かかか"
# tidyr
あまり 'tidy' なプログラムでもないが,この 3 行のプログラムでの実行時間は 11.633, 11.909, 12.028 であった。
平均値は 11.857 秒。
library(dplyr)
library(tidyr)
system.time({
sample = read.csv("sample.csv")
sample_col <- sample %>% unite(new_label,label,label2,remove=TRUE,sep="_")
write.csv(sample_col, "tidyr.csv", row.names=FALSE)
})
# Base R
最近では tidyr は知っているが,Base R は知らない(書けない)という人も多いようであるが,この 4 行のプログラムでの実行時間は 12.017, 11.987, 12.020 であった。
平均値は 12.008 秒。
system.time({
sample = read.csv("sample.csv")
sample$new_label = paste(sample$label, sample$label2, sep="_")
sample = sample[c("id", "new_label")]
write.csv(sample, "BaseR.csv", row.names=FALSE)
})
# AWK
AWK を知らない人も多いと思うが,この例のような簡単なデータ前処理には十分使える。
この CSV ファイルの構造をフルに利用して,実質 4 行のプログラムを書く。
これくらい短ければ,使い捨てのプログラムをすぐ書ける。
実行時間は 11.026, 11.087, 10.952 であった。
平均値は 11.0217 秒。
BEGIN {
getline
print "\"id\",\"new_label\""
}
{
sub("\",\"", "_", $0)
print $0
}
結果
AWK が最速という結果になった。