我正在寻找一种更有效的方法来从整数列表1:n中抽样,多次,其中概率向量(也是长度n)每次都不同.对于n = 10的20次试验,我知道可以这样做:
probs <- matrix(runif(200), nrow = 20)
answers <- numeric(20)
for(i in 1:20) answers[i] <- sample(10,1,prob=probs[i,])
Run Code Online (Sandbox Code Playgroud)
但是,每次调用样本10次只是为了得到一个数字,所以它可能不是最快的方式.速度会有所帮助,因为代码会这么做很多次.
非常感谢!
卢克
编辑:非常感谢Roman,他对基准测试的想法帮助我找到了一个很好的解决方案.我现在把它转到了答案.
只是为了好玩,我又尝试了两个版本。您进行这次抽样的规模是多少?我认为所有这些都非常快并且或多或少等效(我没有包括为您的解决方案创建问题)。很乐意看到其他人对此进行尝试。
library(rbenchmark)
benchmark(replications = 1000,
luke = for(i in 1:20) answers[i] <- sample(10,1,prob=probs[i,]),
roman = apply(probs, MARGIN = 1, FUN = function(x) sample(10, 1, prob = x)),
roman2 = replicate(20, sample(10, 1, prob = runif(10))))
test replications elapsed relative user.self sys.self user.child sys.child
1 luke 1000 0.41 1.000 0.42 0 NA NA
2 roman 1000 0.47 1.146 0.46 0 NA NA
3 roman2 1000 0.47 1.146 0.44 0 NA NA
Run Code Online (Sandbox Code Playgroud)