【发布时间】:2019-12-17 17:36:29
【问题描述】:
如何在不替换的情况下在 sapply 函数中抽取样本?考虑下面的 MWE。我想要实现的是idDRAW 中的一个数字接收来自chrSMPL 的一封信(给定chrSMPL 的样本大小)。来自idDRAW 的号码是否收到信件取决于各自的概率、风险因素和类别。这在 sapply 函数中计算并存储在 tmp 中。
问题是样本替换,导致一个数字被多次命名为一个字母。如何在仍然使用 sapply 功能的同时避免更换?我试图调整这个问题(Alternative for sample)中的代码以满足我的需要,但没有运气。提前致谢。
set.seed(3)
chr<- LETTERS[1:8]
chrSMPL<- sample(chr, size = 30, replace = TRUE)
idDRAW<- sort(sample(1:100, size = 70, replace = FALSE))
p_mat<- matrix(runif(16, min = 0, max = 0.15), ncol = 2); rownames(p_mat) <- chr ## probability matrix
r_mat <- matrix(rep(c(0.8, 1.2), each = length(chr)), ncol = 2); rownames(r_mat) <- chr ## risk factor matrix
r_cat<- sample(1:2, 70, replace = TRUE) ## risk categories
# find number from `idDRAW` to be named a letter:
Out<- sapply(chrSMPL, function(x){
tmp<- p_mat[x, 1] * r_mat[x, r_cat]
sample(idDRAW, 1, prob = tmp)
})
> sort(Out)[1:3]
G B B
5 5 5
【问题讨论】:
-
我觉得简单的答案是不要在其中使用
sapply和sample。识别来自idDRAW的哪些号码接收到字母,然后一步采样这些字母而无需替换,而不是一次一个。然而,我很困惑,因为charSMPL有重复,即使idDRAWs 是唯一的,你仍然会在Out中重复。 -
charSMPL的重复是我想要的idDraw@Gregor --reinstate Monica-- 的独特画作。