草薙の研究ログ

英語の先生をやってます。

Rで繰り返し数列を振る

1, 2, 3, ... nという連番を振るなら,

1:10
seq(1,10,1)

などとやればよいのだけど,1からnまでの連番をm回繰り返したいときがある。
たとえば1, 2, 3, 1, 2, 3, 1, 2, 3みたいな。
これもrep関数で便利にできる。

rep(1:3, 3)

しかし,1, 1, 1, 2, 2, 2, 3, 3, 3みたいにしたいときめんどい。
for関数を使えばよい。でも,すぐfor関数を使ったりそれを埋め込んだりする男はディナーの支払いがスマートでない男のようなものだって祖母がいってた。
実はこれ,ちょっと気が効いたやり方がある。

#まずはさっきと同じ
rep(1:3, 3)
[1] 1 2 3 1 2 3 1 2 3

#これを行列にする
matrix(rep(1:3, 3),3,3)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    2    2    2
[3,]    3    3    3

#これを転置しちゃう
t(matrix(rep(1:3, 3),3,3))
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    2    3
[3,]    1    2    3

#これを戻す
as.numeric(t(matrix(rep(1:3, 3),3,3)))
[1] 1 1 1 2 2 2 3 3 3

うぇーい。できた。
などとこれまでずっと数年間この方法でやっていたら,最近になってrep関数にオプションがあることを知った。
「なんですかそのジジ臭いやりかたは!」と怒られた。ばあちゃん,ごめん。

#eachを使う
rep(1:3,each=3)
[1] 1 1 1 2 2 2 3 3 3

まぢで。
やはりなんでもすぐ調べる癖をもたなければならぬ。メロスは政治がわからぬらしいが私はなかなかスマートにはなれぬ。