R: select 基于概率的子集

R: select a subset based on probability

我是 R 的新手。我服从正态分布。

n <- rnorm(1000, mean=10, sd=2)

作为练习,我想根据从值导出的概率曲线创建一个子集。例如,对于 <5 的值,我想保留 25% 的随机条目,对于 >15 的值,我想保留 75% 的随机条目,对于 5 到 15 之间的值,我想线性插值概率选择范围在 25% 到 75% 之间。似乎我想要的是 "sample" 命令及其 "prob" 选项,但我不清楚语法。

sample() 中的 prob 选项给出了要采样的向量的概率权重。

https://www.rdocumentation.org/packages/base/versions/3.5.2/topics/sample

因此,如果我正确理解问题,您想要的是仅对小于 5 的值的 25% 和大于 75 的值的 75% 进行采样,依此类推。

那你就得用n参数

如文档所述

n 一个正数,可供选择的项目数。请参阅“详细信息”。

在那里你可以输入你想要的样本百分比乘以样本向量的长度。

对于您的最后一个示例,您可以将统一变量添加到 运行 从 .25 到 .75 runif()

希望对您有所帮助!

对于前两个子集,我们可以使用

idx1 <- n < 5
ss1 <- n[idx1][sample(sum(idx1), sum(idx1) * 0.25)]
idx2 <- n > 15
ss2 <- n[idx2][sample(sum(idx2), sum(idx2) * 0.75)]

而对于第三个,

idx3 <- !idx1 & !idx2
probs <- (n[idx3] - 5) / 10 * (0.75 - 0.25) + 0.25
ss3 <- n[idx3][sapply(probs, function(p) sample(c(TRUE, FALSE), 1, prob = c(p, 1 - p)))]

其中 probsn[idx3] 的每个元素的线性插值概率。然后使用 sapply 我们为每个元素绘制 TRUE(取)或 FALSE(不取)。