ベクトルの自動生成

ベクトルを自動生成する方法について。
seq(), rep() および paste() 関数を使って、数列や、規則的なラベルを自動的に生成します。

seq() 関数

seq() 関数を使うと、等差数列を簡単に構築できます。

seq(from, to) で、from から to まで 1 ずつ増加/減少するベクトルを構築します。

> seq(1,5)    # 1 から 5 まで 1 ずつ増やす
[1] 1 2 3 4 5
> seq(5,1)    # 5 から 1 まで 1 ずつ減らす
[1] 5 4 3 2 1

増分値は、by オプションで指定できます(デフォルトで ±1)。

> seq(1,5, by=0.5)    # 1 から 5 まで 0.5 ずつ増やす
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> seq(5,1, by=-0.5)    # 5 から 1 まで 0.5 ずつ減らす
[1] 5.0 4.5 4.0 3.5 3.0 2.5 2.0 1.5 1.0

あるいは、ある範囲を N-1 等分*1したい場合には、by オプションの代わりに length.out オプションを指定します。

> seq(1,5, length.out=9)    # 1 から 5 まで 9-1 等分
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> seq(5,1, length.out=9)    # 5 から 1 まで 9-1 等分
[1] 5.0 4.5 4.0 3.5 3.0 2.5 2.0 1.5 1.0

なお増分値が±1の場合は、コロン(:)を使って簡単に記述できます。

> 1:5
[1] 1 2 3 4 5
> 5:1
[1] 5 4 3 2 1

rep() 関数

rep() 関数を使うと、既存のベクトルの要素を反復させた、長いベクトルを構築できます。

反復のしかたを制御するには、times と each オプションを使います。times オプションは、ベクトル全体を繰り返す回数、each オプションは、ベクトルの各要素を繰り返す回数を指定します。

> rep(1:3, times=3)    # c(1,2,3) 全体を 3 回繰り返す
[1] 1 2 3 1 2 3 1 2 3
> rep(1:3, each=3)    # c(1,2,3) の各要素を 3 回ずつ繰り返す
[1] 1 1 1 2 2 2 3 3 3
> rep(1:3, each=3, times=2)    # c(1,2,3) の各要素を 3 回ずつ繰り返して、その全体を更に 2 回繰り返す
 [1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3

length.out オプションを指定すると、ベクトルの長さを切り詰め/引き伸ばしできるようです。

> rep(1:3, each=3, times=2, length.out=10)    # 長さを 10 に切り詰める
 [1] 1 1 1 2 2 2 3 3 3 1
> rep(1:3, each=2, length.out=10)    # 長さが 10 になるまで引き伸ばす
 [1] 1 1 2 2 3 3 1 1 2 2

paste() 関数

paste() 関数が何をする関数だったかは、こちらをご覧ください。
今回の seq() 関数を使うと、ラベルを効率的に作成できます。
例えば、x1, x2, ..., x5 というラベルを作るときは、

> paste('x', 1:5, sep='')
[1] "x1" "x2" "x3" "x4" "x5"

で作成できます。
また、x1y1, x1y2, x2y1, x2y2, x3y1, x3y2 というラベルを作るときは、

> paste(rep(paste('x', 1:3, sep=''), each=2), paste('y', 1:2, sep=''), sep='')
[1] "x1y1" "x1y2" "x2y1" "x2y2" "x3y1" "x3y2"

こんな感じでしょうか*2

*1:ベクトルの長さが N のとき、値は N-1 等分されます。

*2:この程度なら、普通に手打ちしたほうが早い気もしますが…。