R中的抽样漏洞? [重复]

问题描述 投票:-1回答:2

这个问题在这里已有答案:

我试图从数字向量中采样一个元素。

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

例如:

sample(c(100, 1000), 1)

然而,结果是100或1000

sample(c(100), 1)

导致不同的数字小于100。

到底是怎么回事?

r sampling
2个回答
3
投票

看看样本函数的Details

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


2
投票

这是(不幸的是)预期的行为。见?sample。详细信息部分的第一行:

如果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)
© www.soinside.com 2019 - 2024. All rights reserved.