是否有简洁(内置)方法通过将值视为概率来从数组中对索引进行采样?

mer*_*011 0 random r

假设我有一个总和的概率向量1,例如foo = c(0.2,0.5,0.3).

我想通过将值视为概率来从该向量中采样索引.特别是,我想1用概率0.2,2概率0.53概率进行抽样0.3.

这是一个实现,类似于我写的内容C:

sample_index = function(probs) {
    r = runif(1)
    sum = 0
    for (i in 1:length(probs)) {
        sum <- sum + probs[i] 
        if (r < sum) return(i)
    }
}
foo = c(0.2,0.5,0.3)
print(sample_index(foo));
Run Code Online (Sandbox Code Playgroud)

有没有更直接/内置/规范的方式来做到这一点R

Gre*_*gor 5

它总是让我微笑,并认为当人们在寻找一个功能并在他们的问题中反复使用它的名字时,R正在做得很好.

foo <- c(0.2, 0.5, 0.3)
sample(x = 1:3, size = 1, prob = foo)
Run Code Online (Sandbox Code Playgroud)

根据您的使用情况,您可以使它更通用一些:

sample(x = seq_along(foo), size = 1, prob = foo)
Run Code Online (Sandbox Code Playgroud)

但要小心,如果样本x的长度为1 ,则样本有时会很方便,但通常会出现意外行为.如果要将其包装在函数中,请检查输入长度

if (length(foo) == 1) foo else sample(x = seq_along(foo), size = 1, prob = foo)
Run Code Online (Sandbox Code Playgroud)