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

时间:2012-12-21 12:22:44

标签: r

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

我想从这个矢量中采样,如果它的长度是1,它总是采样1个数字。

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

3 个答案:

答案 0 :(得分:17)

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

  

如果x的长度为1,则为numericis.numeric}和x >= 1,则样本的抽样来自{{1} }}。请注意,1:xx等通话中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