web-dev-qa-db-ja.com

繰り返されるシーケンスを繰り返す

次のような配列を取得したいと思います。

1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4

それを行う最も簡単な方法は何ですか?

17
Fabian Stolz

1回のrep呼び出しでそれを行うことができます。 eachおよびtimesパラメーターは、eachが最初に実行されるように順番に評価されます。

rep(1:4, times=3, each=3)
#[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
44
42-

または、より単純です(配列ではなくベクトルを意味すると仮定します)

rep(rep(1:4,each=3),3)
18
Dieter Menne

42-の答えは、数字のシーケンスが1ずつ増加する場合に機能します。ただし、設定された間隔(たとえば、0から60 x 15)だけ増加する数字のシーケンスを含める場合は、次のようにします。

rep(seq(0,60,15), times = 3)
[1]  0 15 30 45 60  0 15 30 45 60  0 15 30 45 60  

これを繰り返す回数を変更するだけです。

6
TheSciGuy

このような:

rep(sapply(1:4, function(x) {rep(x, 3)}), 3)

rep(x、N)は、xN回繰り返すベクトルを返します。 sapplyは、指定された関数をベクトル1:4の​​各要素に個別に適用し、各要素を3回連続して繰り返します。

2
Stef Sijben

apermで配列操作を使用するメソッドを次に示します。アイデアは、値を含む配列を構築することです。 apermを使用して目的の出力に一致するようにそれらを再配置してから、cを使用して配列を「展開」します。

c(aperm(array(1:4, dim=c(4,3,3)), c(2, 1, 3)))
 [1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
0
lmo