これ(ベクトル)をこう(マトリックスに)したい
はじめに
これをこうしたい.
こういう変換をなんというかわからない.
時系列データで自己回帰モデルなどのベクトルからマトリックスデータを作成したい.
具体的には下図のようなベクトルから下図のようなマトリックスを作成したい.
愚直な方法
R言語の設定を行う.
y <- 1:20 nrows <- 8 ncols <- 13
for文を使って愚直にデータを穴埋めする方法はすぐに思いつく.
data <- matrix(0, nrow = nrows, ncol =ncols) for(i in 1:nrows){ data[i,] <- y[(1:ncols)+(i-1)] }
これで一応は目的のマトリックスは得られるが,
かっこよくない.
for文を使っているのが原因だろうか...
apply系を使用
Rの代表的(?)な関数にapplyがある. 詳しくは Rプログラム (TAKENAKA's Web Page) を参照されたい. やりたい処理が図で示されているので, apply系の中でどれを使えばいいか一目でわかる.
今回はsapplyを用いて目的のマトリックスを作成する.
data <- sapply(1:ncols, function(l) matrix( y[1:nrows+(l-1) ] ))
これで目的のマトリックスを作成できる. for文が無いだけでかっこよくかけてますね(?).
比較してみる
実行時間に違いがあるのか簡単にテストしてみます. テスト方法としては2000回実行したときの実行時間を比較します.
start_time <- Sys.time() for(k in 1:2000){ # 処理 } end_time <- Sys.time() end_time-start_time
結果
手法 | 計測時間 |
---|---|
apply | 0.285207 secs |
for文 | 0.04589605 secs |
おかしいな...
for文の方が速いぞ?
for文が遅いってのは昔の話なのか...
まとめ
簡単な処理すぎてfor文の方が早くなったのかな? for文の方が可読性も高いのは気のせいだろうか?
ツッコミどころ満載なことを書いてしまったので,誰か修正をよろしくお願いします(他力本願).