2014年6月8日日曜日

Rで複数のベクトルからランダムに1つを選択する

読者からの質問に答えるコーナーを作ろうと思いましたが、そんなものは届かないので、Yahoo知恵袋に寄せられた質問に勝手に答えることにしてみました。

統計ソフトRにおいて『ベクトル(1,3),(2,6),(3,10)の中からランダムに一つとり、そ... - Yahoo!知恵袋

統計ソフトRにおいて『ベクトル(1,3),(2,6),(3,10)の中からランダムに一つとり、そのベクトルをxとする』ということをしたいのですが、可能でしょうか?

すでにベストアンサーが選ばれており、↓こんなやり方が提示されておりました。

a = matrix(c(1,3,2,6,3,10),2,3)
x = a[,floor(runif (1,min=1,max=4))]


このスクリプトは、質問者の要望どおりに動きます。

では、私は何をすれば・・・?

(心の声: ケチをつければいいんじゃよ)

そうします。

回答者は、選択肢となる複数のベクトルが列ベクトルになっているような行列を作って、その中からランダムに列を選択するという方法をとっています。

でも、もっと単純に、複数のベクトルから成るリストを作って、その要素から選択するという方が、理解しやすいように思います。

また、runifという連続型の確率分布の関数を使って、その結果をfloor関数で離散値(整数)に変えています。最初から離散型のsample関数を使えばいいのでは?

あと、代入に「 = 」(イコール)を使っていますが、推奨されている 「 <- 」 を使ったほうがいいかなあって。これは、「左辺と右辺は等しい」のような意味ではなく、「左辺に右辺を代入する」って意味だぞってことを明確にするためです。

で、私のお勧めするスクリプトは下記です↓

a <- list( c(1,3), c(2,6), c(3,10) )
x <- unlist( sample(a, 1) ) # リストaの要素から1つ選ぶ



リストの要素をsample関数で取り出すと、部分リストとして値が返されるみたいなので、unlist関数でベクトルにしてやらなきゃいけないところが、ちょっと一手間ですが、それ以外はごく自然でシンプルだと思います。


【蛇足】
ベストアンサーの回答者の上から目線がちょっと気になりました。
subspace2013さん ,R言語の乱数ね。

(中略)

さて、これが期待されていた実行結果カナ? 何が解らなかったのだろう?





0 件のコメント:

コメントを投稿