統計学と疫学と時々、助教生活

疫学を専門とする助教の研究に関する備忘録的ページ。

R データの読み込み(高速化)

今回はSpringerから出ている『Genome-Wide Association Studies and Genomic Prediction』という本からデータの読み込みについて記述する。

GWASなどのゲノムデータは非常に膨大であり、読み込みだけでもかなりの時間を要する。そこで下記のTipsで幾分改善されることがあるので、紹介する。

ここで使用するのは、本書のExtra dataでsquare.txtという1,000 samples(つまり1000人)×50,000 SNPsのデータを読みこむことにする。

1 まずは普通に読み込む

mydata = read.table("square.txt", sep="\t")

結果は38秒ほどかかっている

##    user  system elapsed 
##  37.960   0.497  38.503

2 scan関数を利用する

ここで、genotype dataとphenotype dataが分割されていることを考える。実はこのように別々に読み込むことでスピードは格段に向上する。
今回は、genotypeだけgenotypes.txtに格納されていることを想定する。

mydata = matrix(scan(file="genotypes.txt", what=integer(), sep="\t"), 50000, 1000, byrow=T)

先ほどの1/3程度(11.2秒)まで読み込み速度が向上。

##    user  system elapsed 
##  10.806   0.396  11.249

3 readLines関数を利用する

mydata = readLines(con="genotypes.txt")

さらに3秒ほどの短縮につながっている。ただし、この関数では、これまでの関数とは異なりマトリックス構造ではないという短所を持つ。

##    user  system elapsed 
##   8.076   0.048   8.163

4. readChar関数を利用する

mydata = readChar(con="genotypes.txt", nchars=file.info("genotypes.txt")$size, useBytes=T)

格段に読み込み速度は速い(0.2秒)ことがわかる。一方で、構造の変化をする必要があり、総合的に見るとread.tableよりも遅くなる可能性もある。

##    user  system elapsed 
##   0.218   0.053   0.272

この程度のデータセットであれば、数十秒の差であるが、さらに大きなデータになれば、このTipsがさらに役に立つ可能性が高い。

www.springer.com



20161226
RF