如何高效从长度100向量的20元排列中抽取50个样本?
高效抽取随机排列样本的方法
你遇到的问题核心是直接生成所有100选20的排列完全不现实——这个排列数是100!/(80!)≈1.3×10³⁹,无论是内存存储还是计算时间都不可能完成。正确的思路是跳过全量生成步骤,直接随机生成50个符合要求的排列。
以下是两种简单高效的实现方式:
方法1:基础R循环生成
利用sample()函数的无放回抽样特性(排列本质就是有序的无放回抽样),直接生成单个排列,再通过replicate()批量生成50个:
# 设置随机种子,保证结果可复现 set.seed(123) # 生成50个长度为20的随机排列,结果默认按列存储,转置后每行对应一个排列 sample_perms <- t(replicate(50, sample(1:100, 20, replace = FALSE)))
方法2:tidyverse风格实现
如果你习惯用tidyverse工具链,可以用purrr包批量生成并整理成数据框:
library(purrr) library(tibble) set.seed(123) sample_perms <- map_dfr(1:50, ~ as_tibble_row(sample(1:100, 20, replace = FALSE)))
关键说明
- 这两种方法的时间和内存成本仅和样本量(50)、单排列长度(20)相关,完全可控,不会出现内存溢出或长时间等待的问题。
set.seed()是可选的,加上它可以让你的随机结果固定,方便后续复现分析。
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

