如何在R语言中基于输入向量的分布进行随机抽样?
问题描述
我有一个名为data的数值向量,长度为3205,其前20个元素如下:
head(data,20) [1] 225.43200 29.20875 329.46792 22.70996 [5] 80.84970 374.23959 343.11610 319.04798 [9] 2477.73200 72.79434 30.53376 92.39412 [13] 47.70744 52.30388 339.59634 1177.00448 [17] 48.27329 541.80997 38.45772 1568.93400
该数据的密度图可通过代码plot(density(data))生成,对应密度图:
需求:基于该向量的分布进行随机抽样,要求抽样结果大部分数值在1000以下,小部分在1000-3000之间,且抽样得到的向量的密度图与原数据密度图一致,求最优实现方法。
最优实现方法
直接从原数据中进行随机抽样即可,因为原数据本身就符合你要求的分布特征,抽样会完整保留原分布的形态,是最直接高效的方案。
1. 有放回抽样(推荐,支持任意样本量)
使用R内置的sample()函数,设置replace = TRUE,可指定任意抽样数量(比如和原数据长度一致):
# 设定抽样数量,可根据需求调整 sample_size <- 3205 # 执行有放回抽样 sampled_data <- sample(data, size = sample_size, replace = TRUE)
2. 无放回抽样(适用于样本量小于原数据的场景)
如果不需要重复元素,设置replace = FALSE:
# 抽取1000个不重复样本 sampled_data <- sample(data, size = 1000, replace = FALSE)
验证抽样效果
可以通过绘图对比原数据与抽样数据的密度分布,确认一致性:
# 绘制原数据密度图 plot(density(data), col = "darkblue", main = "原数据与抽样数据密度对比") # 叠加抽样数据的密度曲线 lines(density(sampled_data), col = "darkred", lty = 2, lwd = 1.5) # 添加图例 legend("topright", legend = c("原数据", "抽样数据"), col = c("darkblue", "darkred"), lty = c(1, 2))
方案优势
- 完全保留原数据的分布特征,自然满足“大部分值<1000、小部分值在1000-3000”的要求
- 无需拟合复杂概率模型,计算效率极高
- 样本量足够时,抽样数据的密度图与原数据几乎完全重合
内容的提问来源于stack exchange,提问作者locket
相关产品推荐
相关产品推荐

