R 来自可变长度向量的样本(包括1个)

R 来自可变长度向量的样本(包括1个),r,R,我有一个长度可变的向量,它的长度有时可能是1 我想从这个向量中取样,如果它的长度是1,它总是取样1个数字 sample()不会这样做,因为当样本大小为1时,它从1到数字进行采样。这是一个有文档记录的功能: 如果x具有长度1,是数值的(在是数值的)并且x>=1,则通过采样从1:x进行采样。请注意,在调用中,例如sample(x),当x的长度不同时,此方便功能可能会导致不期望的行为 另一种方法是编写自己的函数以避免该功能: sample.vec <- function(x, ...) x[sa

我有一个长度可变的向量,它的长度有时可能是1

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


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

这是一个有文档记录的功能:

如果
x
具有长度
1
,是
数值的
(在
是数值的
)并且
x>=1
,则通过采样从
1:x
进行采样。请注意,在调用中,例如
sample(x)
,当
x
的长度不同时,此方便功能可能会导致不期望的行为

另一种方法是编写自己的函数以避免该功能:

sample.vec <- function(x, ...) x[sample(length(x), ...)]
sample.vec(10)
# [1] 10
sample.vec(10, 3, replace = TRUE)
# [1] 10 10 10

sample.vec当只输入一个数字时,
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)

mylist您可以使用此函数的“无错误”重新定义:

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

这个问题的答案是
sample
的帮助文件,请参见
?sample
,并仔细阅读“详细信息”部分,如果x的长度为1,是数字的(在is.numeric的意义上)且x>=1,通过sample进行的采样从1:x开始。
有没有办法让操作系统只对单个值进行采样?显然,我们在同一时刻发布了相同的答案。因此,我将我的答案移到了另一个相同的问题上,并投票决定合并这两个问题。谢谢@Joris。我认为我的答案比你的多一点,所以如果你同意的话,请随意补救。我宁愿关闭新的一个,但我不知道在这种情况下是否有一个适当的政策。我已经投了你的票:)。我标记了要合并的问题,因此当出现这种情况时,所有答案都被添加到一起。我本想关闭另一个窗口,但显然我在错误的窗口中单击了“投票关闭”。对不起,我弄错了。