ベクトルの自動生成
ベクトルを自動生成する方法について。
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。