我有一个长度不同的向量,有时长度为 1。
我想从这个向量中采样,如果它的长度为 1,它总是对 1 个数字进行采样。
sample()
不会这样做,因为当样本大小为 1 时,它会从 1 采样到数字。
我有一个长度不同的向量,有时长度为 1。
我想从这个向量中采样,如果它的长度为 1,它总是对 1 个数字进行采样。
sample()
不会这样做,因为当样本大小为 1 时,它会从 1 采样到数字。
这是一个记录在案的功能:
如果
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 会导致意想不到的结果?
当只输入一个数字时,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)
注意:您可以替换sample
以sample.int
获得一点速度增益。
您可以使用此函数的“无错误”重新定义:
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