我有一个长度不一的矢量,有时长度为1.
我想从这个矢量中采样,如果它的长度是1,它总是采样1个数字.
sample() 不会这样做,因为当样本大小为1时,它从1到数字进行采样.
flo*_*del 20
这是一个记录在案的功能:
如果
x有长度1,则是numeric(在某种意义上is.numeric)并且x >= 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
Run Code Online (Sandbox Code Playgroud)
seq vs seq_along下列出了一些具有相似行为的函数.何时使用seq会导致意外结果?
Jor*_*eys 16
只喂一个号码,sample就像sample.int(见?sample)一样.如果你想确保只提供你给它的矢量样本,你可以使用索引并使用这个结构:
x[sample(length(x))]
Run Code Online (Sandbox Code Playgroud)
无论长度如何,这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)
Run Code Online (Sandbox Code Playgroud)
注意:您可以替换sample通过sample.int得到一点点速度增益.