You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中从分箱分布无放回抽取样本的高效实现方法

R中针对计数向量的无放回下采样简便实现

针对你描述的场景——给定分箱计数向量v(每个元素对应一类样本的数量,总样本量N = sum(v)),需要无放回抽取n < N个样本并得到新的分箱计数,完全不用先生成完整的类别向量再抽样统计,有两种更高效的实现方式:

方法1:用专门的多元超几何抽样函数(推荐)

多元超几何分布正是对应这种无放回多类别抽样场景,extraDistr包的rmvhyper函数可以直接生成结果,无需额外处理:

  1. 先安装并加载包:
install.packages("extraDistr")
library(extraDistr)
  1. 调用函数获取抽样后的计数向量:
v <- c(5, 3, 2)  # 示例:3个类别分别有5、3、2个样本
n <- 4           # 要抽取的总样本量

# 生成1组抽样结果
new_counts <- rmvhyper(nn = 1, m = v, n = n)
new_counts

返回的new_counts就是抽样后每个类别的样本数,结果符合无放回抽样的规则(每个类别的抽样数不会超过原数量)。

方法2:基础包原生实现(无需额外安装包)

如果不想引入第三方包,可以通过索引映射的方式实现,避免生成大向量占用内存:

v <- c(5, 3, 2)
n <- 4

# 计算总样本量及类别分界点
total <- sum(v)
breaks <- cumsum(c(0, v))

# 抽取样本索引并映射到对应类别
sample_indices <- sample(total, n)
categories <- findInterval(sample_indices, breaks)

# 统计每个类别的数量
new_counts <- tabulate(categories)
new_counts

这种方法通过操作索引而非完整的类别向量,在样本量很大时能显著节省内存。

两种方法都比你提到的“生成完整向量→抽样→统计”的流程更高效,尤其当总样本量N很大时优势明显。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:15:34