sample.csv は 17035201 行の CSV ファイルである。最初の 7 行は以下のようになっている。
"id","label"
1,"aaa_あああ"
2,"aaa_いいい"
3,"bbb_ううう"
4,"bbb_えええ"
5,"ccc_おおお"
6,"ccc_かかか"
これを入力とし,以下のように変更を加え出力する。
"id","new_label1","new_label2"
1,"aaa","あああ"
2,"aaa","いいい"
3,"bbb","ううう"
4,"bbb","えええ"
5,"ccc","おおお"
6,"ccc","かかか"
# tidyr
あまり 'tidy' なプログラムでもないが,この 3 行のプログラムでの実行時間は 111.195, 101.132, 100.276 であった。
平均値は 104.201 秒。
しかし,システムが使用する時間が同程度あり,結局経過時間(計算開始から結果が出るまでの時間)は実に751.059, 686.955, 827.347 で,平均値は 755.120 秒,実に 12 分超である。
library(dplyr)
library(tidyr)
system.time({
sample = read.csv("sample.csv")
sample_col <- sample %>% separate(label,into=c("new_label1","new_label2"),sep="_")
write.csv(sample_col, "tidyr.csv", row.names=FALSE)
})
# Base R
最近では tidyr は知っているが,Base R は知らない(書けない)という人も多いようであるが,この 6 行のプログラムでの実行時間は 23.509, 23.268, 22.892 であった。平均値は 23.223 秒。
経過時間は 24.190 秒である。tidyr によるものより 30 倍速い。
system.time({
sample = read.csv("sample.csv")
a = unlist(strsplit(sample$label, "_"))
sample$new_label1 = a[seq(1, 12, by=2)]
sample$new_label2 = a[seq(2, 12, by=2)]
sample = sample[c("id","new_label1","new_label2")]
write.csv(sample, "BaseR.csv", row.names=FALSE)
})
# AWK
AWK を知らない人も多いと思うが,この例のような簡単なデータ前処理には十分使える。
この CSV ファイルの構造をフルに利用して,実質 5 行のプログラムを書く。実行時間は 20.328, 20.503, 20.126 であった。
平均値は 20.319 秒。
BaseR によるよりも二割方速い。tidyr に比べると 5 倍速い。
BEGIN {
FS = ","
getline
print "\"id\",\"new_label1\",\"new_label2\""
}
{
split($2, t, "_")
printf "%s,%s\",\"%s\n", $1, t[1], t[2]
}
結果
AWK が最速という結果になった。