我有一个长度不一的向量,有时长度为1。
我想从这个矢量中采样,如果它的长度是1,它总是采样1个数字。
sample()
不会这样做,因为当样本数量为1时,它会从1到数字进行采样。
答案 0 :(得分:17)
这是一个记录在案的功能:
如果
x
的长度为1
,则为numeric
(is.numeric
}和x >= 1
,则样本的抽样来自{{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 vs seq_along. When will using seq cause unintended results?
下列出了一些行为相似的功能答案 1 :(得分:15)
如果只提供一个号码,sample
就像sample.int
一样(请参阅?sample
)。如果你想确保它只是你给它的矢量样本,你可以使用索引并使用这个结构:
x[sample(length(x))]
无论x
的长度如何,这都能为您提供正确的结果,而无需添加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)
注意:您可以将sample
替换为sample.int
以获得一点速度提升。
答案 2 :(得分: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