假设我有2个矩阵:
x <- matrix(rep(1:5, 2), ncol=5, byrow=T)
prob <- matrix(rep(0, each=5, 2), ncol=5, byrow=T)
prob[1, 3] <- 1
prob[2, 4] <- 1
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 2 3 4 5
> prob
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 1 0 0
[2,] 0 0 0 1 0
我想使用sample()
从矩阵执行“逐行”采样。例如,sample
将使用x
同一行中的概率从prob
的每一行中选择一个值。在上面的示例中,我希望sample
每次都返回c(3,4)
,因为第一行的概率设置为3 = 100%,第二行的概率设置为4 = 100%。
但是,当我运行sample(x, prob=prob, size=nrow(x))
时,我收到3
并且4
是任意顺序:
> sample(x, prob=prob, size=nrow(x))
[1] 4 3
> sample(x, prob=prob, size=nrow(x))
[1] 3 4
如何对矩阵x
进行“逐行”采样?
答案 0 :(得分:2)
带有mapply
和asplit
的一个选项
mapply(sample, asplit(x, 1 ), prob = asplit(prob, 1), size = 1)
#[1] 3 4
答案 1 :(得分:2)
您可以使用vapply
(通过指定期望的内容更安全)遍历每一行:
x <- matrix(rep(1:5, 2), ncol=5, byrow=T)
prob <- matrix(rep(0, each=5, 2), ncol=5, byrow=T)
prob[1, 3] <- 1
prob[2, 4] <- 1
vapply(seq_len(nrow(x)), function(i) {
sample(x[i, ], prob = prob[i, ], size = 1)
}, FUN.VALUE = numeric(1)
)
#> [1] 3 4