Rでデータを整形する。

僕の研究は高次元データを扱うのだけれど、人工的に発生させたデータならともかく、生のデータをそのままごにょごにょすることは、まあほとんどしない。
理由はいくつかあるのだけど、一番は、各次元ごとにスケールが違うことが多いので、そのまま使ってデータの処理を行うと、結果はスケールの大きなデータの動きに引っ張られる。
という訳で、データは大抵の場合、正規化を行ったりする。

これまではデータの整形もPythonで行っていたのだけれど、いい加減面倒くさくなってきて、今後はデータ整形の場面にRを積極的に使っていこうと思っている。
とにかく、僕は行列を簡単に処理したい、ただそれだけのこと。

今回は、各列ごとににデータを-1〜1にスケーリングする必要があったので、その処理をRで書いた。
なんかまだよく分かっていないが、いろいろと便利な関数があって、普通のプログラミング言語のようにfor文とかで行と列の大きさだけ繰り返す必要がないのが便利だと思った。

# Leukemiaの発現量データを読み取る
leukemia <- read.table("expression_test.data")

# 各列ごと(遺伝子ごと)に発現量を-1〜1にスケーリング
nleukemia <- 2 * scale(leukemia, apply(leukemia, 2, min),
              (apply(leukemia, 2, max) - apply(leukemia, 2, min))) - 1

# データを出力する
write(nleukemia, 'normalized_expression_test.data',
                           ncolumns=length(nleukemia[1,]))

leukemiaというのは今使っているデータなので、得に気にする必要はない。
applyとかいうのが列や行ごとに処理ができるっぽくて、scaleが列に大して引き算や割り算を行った結果を返すらしい。
あと、出力のときに列の大きさを適当に変えられてしまったので、オプションを使ってデータの列数とそろえるなどした。

関数の使い方さえ覚えれば非常に楽に作業ができて非常によろしい。