昔自分用にメモったのを修正して公開メモに。
ヘルプの概略
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!