10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sample関数の再確認

Posted at

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

ヘルプの概略

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!

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?