R中的采样错误?

时间:2018-11-26 16:05:11

标签: r sampling

我正在尝试从数值向量中采样一个元素。

向量的长度> 1时,结果是向量的数字之一,与预期的一样。但是,当向量包含一个元素时,它会采样一个介于0和此单个数字之间的数字。

例如:

sample(c(100, 1000), 1)

结果为100或1000,

sample(c(100), 1)

结果的数字小于100。

这是怎么回事?

2 个答案:

答案 0 :(得分:3)

看看示例函数的Details

“如果x的长度为1,则为数字(在is.numeric的意义上),并且x> = 1,则通过样本从1:x开始进行采样”

答案 1 :(得分:2)

这是(不幸的)预期行为。参见?sample Details 部分的第一行:

  

如果x的长度为1,则为数字(即is.numeric)和x >= 1,则从1:x进行采样。请注意,当x在诸如sample(x)之类的呼叫中长度不同时,此便利功能可能导致不良行为。请参阅示例。

幸运的是,Examples部分提供了建议的修复程序:

# sample()'s surprise -- example
x <- 1:10
    sample(x[x >  8]) # length 2
    sample(x[x >  9]) # oops -- length 10!
    sample(x[x > 10]) # length 0

## safer version:
resample <- function(x, ...) x[sample.int(length(x), ...)]
resample(x[x >  8]) # length 2
resample(x[x >  9]) # length 1
resample(x[x > 10]) # length 0

当然,您也可以只使用if语句:

sampled_x = if (length(my_x) == 1) my_x else sample(my_x, size = 1)