Help us understand the problem. What is going on with this article?

sample関数の再確認

More than 1 year has passed since last update.

昔自分用にメモったのを修正して公開メモに。

ヘルプの概略

Usage

sample(x, size, replace = FALSE, prob = NULL)

Arguments

x: サンプリング元のデータ。長さが1もしくはそれ以上のベクトル。詳細は後述。

size: サンプリング回数。非負の整数で指定。

replace: サンプリングする際,同一の要素を繰り返しサンプリングするのを許容するかどうか。論理値で指定。

prob: サンプリング元のデータについて,サンプリングする際の重み付けを確率のベクトルで指定。

Details (気になるところだけ)

  • xの長さが1で,かつそれが1以上の数値の場合,サンプリングは1:xから実施される
  • sizeを指定しないと,length(x)回サンプリングする
  • xに正の非整数が使われると端数を切り捨てる。ただし,.Machine$integer.maxを超えない整数とする
  • probはサンプリングする際の重み付けを確率で指定
    • 別に合計が1にならなくてもOK
    • ただし非負かつ全てが0ではないこと
    • replase = TRUEを指定すると,Walker's alias methodを使用するとのこと。

いろいろやってみる

以下,適当に色々やってみます。seedを固定します:

set.seed(57)

1:6からサンプリング

sample(1:6)
#>  [1] 2 3 1 4 6 5
sample(6)
#>  [1] 6 2 3 1 5 4

上述のとおり,これは同値。

固定範囲からサンプリング

sample(3:8)
#>  [1] 8 5 3 4 6 7

非整数の場合

sample(6.8)
#>  [1] 5 4 6 2 3 1
sample(2.6:7.4)
#>  [1] 2.6 6.6 3.6 4.6 5.6

非整数をxに指定した場合はこのようになります。まず,length(x) = 1のとき,端数を切り捨てた整数値として振る舞います。しかし,2.6:7.4のようにすると,最初の値から1ずつ増加していった値からサンプリングしてきます。これはどちらかというと:の仕様です:

2.6:7.4
#>  [1] 2.6 3.6 4.6 5.6 6.6

詳しくは:のヘルプを参照してください。

サンプリングする数を指定

sample(1:100, 10)
#>   [1] 99 21 96  1 94  3 68 58 60 88

そのままです。なお,replaceには何も指定していないのでデフォルト値のFALSEで実行されます。そのためxの長さがsizeの値より小さいとエラーが返ってきます。

replaceを許容する

sample(1:6, replace = TRUE)
#>  [1] 5 1 2 6 5 2
sample(0:1, 100, replace = TRUE)
#>    [1] 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 1 1 0 0 0 0
#>   [36] 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1
#>   [71] 0 0 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 1 0 1 0

そのままです。

確率で重み付けをする

kosaki <- sample(1:3, 100, replace = TRUE, prob = c(0.5, 0.25, 0.25))
kosaki
#>    [1] 2 3 1 2 2 1 1 1 1 3 1 3 3 1 3 1 2 2 3 3 1 1 2 3 1 1 1 2 2 2 2 2 1 3 2
#>   [36] 1 3 1 2 1 1 3 1 1 2 1 3 1 2 3 1 1 1 1 3 1 3 3 3 1 3 2 2 2 1 1 3 1 2 3
#>   [71] 1 1 3 3 1 1 1 1 2 1 3 3 1 1 1 3 2 1 1 1 3 2 1 2 3 1 2 1 3 1
table(kosaki)
#>  kosaki
#>   1  2  3 
#>  48 24 28

このように重み付けできます。あと上述のように,probは別に合計が1にならなくてもOKです:

kutori <- sample(1:3, 100, replace = TRUE, prob = c(50, 25, 25))
kutori
#>    [1] 1 3 1 2 1 3 2 3 1 3 2 2 1 3 3 1 3 1 2 2 2 3 1 1 1 1 1 1 1 2 1 3 3 3 3
#>   [36] 1 1 1 1 1 2 1 2 2 2 1 2 2 1 3 3 3 1 3 1 2 2 1 1 2 3 2 2 1 2 1 2 1 2 1
#>   [71] 1 2 1 1 1 1 3 1 3 3 3 1 2 1 1 1 1 1 3 1 1 1 2 1 2 1 1 2 1 3
table(kutori)
#>  kutori
#>   1  2  3 
#>  50 27 23

なお,length(x)length(prob)が一致しないとエラーを返しますので注意してください。

Enjoy!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away