20

我有一个长度不同的向量,有时长度为 1。

我想从这个向量中采样,如果它的长度为 1,它总是对 1 个数字进行采样。

sample()不会这样做,因为当样本大小为 1 时,它会从 1 采样到数字。

4

3 回答 3

26

这是一个记录在案的功能:

如果x有长度1, 是numeric(在 的意义上is.numeric) 并且x >= 1, 通过 sample 的采样发生在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 vs seq_along下列出了一些具有类似行为的函数。什么时候使用 seq 会导致意想不到的结果?

于 2012-12-21T12:23:39.767 回答
18

当只输入一个数字时,sample工作方式类似于sample.int(参见?sample)。如果你想确保它只从你给它的向量中采样,你可以使用索引并使用这个构造:

x[sample(length(x))]

无论 的长度如何,这都会为您提供正确的结果x,并且无需添加if-condition 检查长度。

例子:

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 回答
0

您可以使用此函数的“无错误”重新定义:

sample = function(x, size, replace = F, prob = NULL) {
  if (length(x) == 1) return(x)
  base::sample(x, size = size, replace = replace, prob = prob)
}

测试它:

> sapply(1:7, base::sample, size = 1)
[1] 1 2 2 4 4 4 4
> sapply(1:7, sample)
[1] 1 2 3 4 5 6 7
于 2019-08-17T04:09:54.743 回答