2017-12-23 37 views
1

お祝い!私は理解できていないという質問があります。数字のランダムシーケンスを生成する... 30回

ランダムな長さの整数(1~20)を生成する必要があります。これは30回再現する必要があります。ランダム長リストを生成するために、私は "runif"関数を使用します。しかし、 "rep"関数を使ってこのランダムなリストを繰り返すと、同じリストが30回繰り返されます。

1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 
1 2 3 
etc. 

代わりに、runifはリストを作成し、担当者は30回それを繰り返し、それは次のようになります:

1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
etc. 

私は理想的なRのように実行するようにしたい私が欲しいのは以下のとおりです。 "runif"コマンドを30回実行する。今、私はこれのためのループを書く方法を知らないし、ループよりもエレガントなものを使う方法も知らない。私は "繰り返し"関数を使ってみましたが、整数を生成しませんが、必要な計算には使用できないリストを返します。

助けてください/アドバイス/アイデアは大いに感謝します!

+0

注意点として: 'REPは()' '複製は()'引数からの呼び出しを繰り返しながら、従って、 '担当者()は '同一の配列を生成し、指定された回数、その引数の値を繰り返します'Replicate()'は各関数呼び出しで異なるシーケンスを生成します。 – Freguglia

答えて

3

使用:

# using set.seed for reproducibility 
set.seed(171223) 

# create a vector of end-points 
ends <- sample(20, 30, TRUE) 

# create a list of vector, each from 1 to an end point in 'ends' 
lst <- Map(':', 1, ends) 

は、このリストが表示されます(最初の5つの要素が示さ):

> lst[1:5] 
[[1]] 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

[[2]] 
[1] 1 2 3 4 5 6 

[[3]] 
[1] 1 2 3 4 5 6 7 

[[4]] 
[1] 1 2 3 4 

[[5]] 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 

を使用すると、1つのベクトルにそれをしたい場合は、unlistでそれをラップすることができます。

lst2 <- unlist(Map(':', 1, ends)) 
> lst2 
    [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 
[55] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 
[109] 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 
[163] 2 3 4 5 6 7 8 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 1 2 3 4 5 6 7 
[217] 1 2 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 1 2 3 4 5 6 1 2 3 4 5 6 1 2 1 2 3 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
+0

unlistの代わりに 'mapply'を使用してください – Onyambu

+0

@Onyambu' mapply'もリストを返すので、あなたはまだ 'unlist' – Jaap

+0

が必要です。異なる長さのためにunlistを返します。ありがとう – Onyambu

3

を次のようにあなたは、1:sample(20, 1) 30回を複製することもできます提供します。

replicate(30, 1:sample(20, 1)) 

これは、次のような(最初の3つの要素のみが示されている)長さ30のリストを生成します。単一のベクター結果が望まれる場合

[[1]] 
[1] 1 2 3 4 5 6 7 

[[2]] 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 

[[3]] 
[1] 1 2 3 4 5 6 7 8 

... 

は、単にunlist()における発現を包みます。

unlist(replicate(30, 1:sample(20, 1))) 
+1

nice!期待される出力を得るために 'unlist'でラップしますか? – Jaap

+0

申し訳ありませんが、質問文のソースの後、私はOPがリストを望んでいると思います...(編集を参照) – Jaap

+0

それを得ました。ありがとう@ジャップ –

関連する問題