20

長さが可変のベクトルがあり、長さが 1 の場合もあります。

長さが1の場合、常にその1つの数値をサンプリングするように、このベクトルからサンプリングしたいと思います。

sample()サンプルサイズが1の場合、1から桁までサンプリングするため、これは行いません。

4

3 に答える 3

26

これは文書化された機能です:

x長さ1が 、 がnumeric( の意味でis.numeric) である場合x >= 1、サンプルによるサンプリングは から行われ1:xます。この便利な機能はx、 などの呼び出しで がさまざまな長さである場合に、望ましくない動作を引き起こす可能性があることに注意してくださいsample(x)

別の方法は、機能を回避するために独自の関数を作成することです。

sample.vec <- function(x, ...) x[sample(length(x), ...)]
sample.vec(10)
# [1] 10
sample.vec(10, 3, replace = TRUE)
# [1] 10 10 10

同様の動作を持ついくつかの関数は、seq と seq_along の下にリストされています。seq を使用すると意図しない結果が生じるのはいつですか?

于 2012-12-21T12:23:39.767 に答える
18

単一の数値のみが与えられた場合、( を参照)sampleのように機能します。指定したベクトルからのみサンプリングするようにしたい場合は、インデックスを操作して次の構成を使用できます。sample.int?sample

x[sample(length(x))]

これにより、 の長さに関係なく、長さをチェックする -conditionxを追加する必要なく、正しい結果が得られます。if

例:

mylist <- list(
  a = 5,
  b = c(2,4),
  d = integer(0)
)

mysample <- lapply(mylist,function(x) x[sample(length(x))])

> mysample
$a
[1] 5

$b
[1] 2 4

$d
integer(0)

注 : を置き換えるとsamplesample.int速度が少し向上します。

于 2012-12-21T12:25:20.620 に答える