来自不同长度的矢量样本(包括1)

use*_*765 15 r

我有一个长度不一的矢量,有时长度为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得到一点点速度增益.

  • +1这是迄今为止最优雅的解决方案. (3认同)