R语言中待采样向量长度≤n时如何实现无放回抽样取完即停
R无放回抽样超量自动停止实现方案
R自带的sample()函数做无放回抽样(即参数replace=FALSE)时,只要指定的抽样样本量大于待抽总体的元素总数,就会直接抛出错误,这是函数内置的参数校验逻辑——毕竟无放回抽样不可能凭空抽出比总体还多的样本。
要实现「总体抽完就自动停、不用硬凑够指定样本量」的效果,根本不用改底层逻辑,只要在调用抽样前,取指定样本量和总体向量长度的较小值,作为实际传给sample的size参数就行。
最简调用
针对你举的例子,按下面的写法跑就不会报错:
# 待抽样总体和想要抽的目标样本量 pop <- c(1,4) target_n <- 5 # 自动截断超量的抽样数 result <- sample(pop, size = min(length(pop), target_n), replace = FALSE)
运行后返回的结果只会是1 4或者4 1,刚好把总体所有元素打乱顺序抽完就结束,完全符合你的预期。
通用函数封装
如果经常要用到这个逻辑,可以封成复用函数,还能兼容原生sample的概率权重参数:
safe_norep_sample <- function(x, size, prob = NULL) { # 样本量超过总体长度时自动截断 actual_size <- min(length(x), size) sample(x, size = actual_size, replace = FALSE, prob = prob) } # 测试超量抽样场景 safe_norep_sample(c(1,4), 5)
不管你指定的size比总体长度大多少,这个函数都不会报错,最多把总体所有元素打乱顺序全返回,不会硬凑样本数。
内容的提问来源于stack exchange,提问作者locket
相关产品推荐
相关产品推荐

