无需使用expand.grid,高效生成多向量组合的随机样本
不用生成全组合网格,直接靠随机索引抽取向量组合样本
假设有三个向量,要从它们的所有可能组合里随机抽样本。常规做法是先用expand.grid生成所有组合的网格,再按索引挑样本,但向量规模一大,这个全网格会瞬间膨胀,占内存又拖慢速度。现在可以直接用随机索引idx和原向量生成目标样本,完全不用生成全网格。
实现思路
核心是把线性索引(也就是idx里的数字)转换成每个向量对应的位置索引,原理类似一维坐标转多维坐标:
- 先算z向量的位置:每
length(z)个组合对应一组x和y的搭配,用取余运算就能得到z的位置 - 把剩下的索引部分用来计算y的位置,同样用取余操作
- 最后剩下的部分就是x的位置
代码示例
x <- 1:3 y <- 10:12 z <- 15:18 # 记录每个向量的长度 len_x <- length(x) len_y <- length(y) len_z <- length(z) # 计算总组合数并生成随机索引 total_combs <- len_x * len_y * len_z rand_idx <- sample(1:total_combs, 10, replace = FALSE) # 将线性索引转换为各向量的位置索引 temp <- (rand_idx - 1) %/% len_z pos_z <- ((rand_idx - 1) %% len_z) + 1 pos_y <- ((temp - 1) %% len_y) + 1 pos_x <- ((temp - 1) %/% len_y) + 1 # 生成最终样本 result <- data.frame( x = x[pos_x], y = y[pos_y], z = z[pos_z] )
这个方法的优势很明显:不管原向量规模多大,内存占用只和样本量有关,完全不会出现expand.grid生成几十万甚至百万行全组合的内存爆炸问题,效率提升非常显著。
内容的提问来源于stack exchange,提问作者BerriJ
相关产品推荐
相关产品推荐

