我正在尝试编写一段似乎需要嵌套*apply
调用的逻辑。
mProb = matrix(rbeta(1000*5, shape1 = 2, shape2 = 3), nrow = 1000, ncol = 5)
vSize = c(900, 1100, 1300, 450, 620)
mIndices = apply(mProb, 1, function(x) {
do.call(rbind, lapply(1:5, function(y) {
cbind(sample.int(n = vSize[y], size = floor(vSize[y]*x[y])), y)
}))
})
有更优雅的方式来编码吗?如果需要,我可以为代码提供上下文。
答案 0 :(得分:0)
我认为mapply()
对于这个问题来说更加优雅和干净,而且似乎更快一些:
mIndices <- mapply(sample.int, size=floor(t(mProb) * vSize), n=vSize )
dim(mIndices) <- c(5,1000)
mIndices现在是一个二维列表,第一个维度对应于 vSize的元素,以及与复制数对应的第二个dim。如果您真的 想要在矩阵列表中,您可以使用嵌套的应用来重塑它:
mIndices <- lapply(1:1000, function(s) {
do.call(rbind, mapply(cbind, mIndices[,s], 1:5) )
})