【问题标题】:Sample draw in sapply without replacement样品在 sapply 中抽取,无需更换
【发布时间】: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 

【问题讨论】:

  • 我觉得简单的答案是不要在其中使用sapplysample。识别来自idDRAW 的哪些号码接收到字母,然后一步采样这些字母而无需替换,而不是一次一个。然而,我很困惑,因为charSMPL 有重复,即使idDRAWs 是唯一的,你仍然会在Out 中重复。
  • charSMPL 的重复是我想要的 idDraw @Gregor --reinstate Monica-- 的独特画作。

标签: r sample sapply


【解决方案1】:

我使用 for 循环使用替代解决方案进行了管理,如下所示。如果有人可以提供有关如何在不使用 for 循环的情况下实现所需结果的建议,将不胜感激。

set.seed(3)
Out <- c()
for(i in 1:length(chrSMPL)){
  tmp <- p_mat[chrSMPL[i], 1] * r_mat[chrSMPL[i], r_cat]
  Out <- c(Out, sample(idDRAW, 1, prob = tmp))
  rm <- which(idDRAW == Out[i])
  idDRAW <- idDRAW[-rm]
  r_cat <- r_cat[-rm]
}

names(Out) <- chrSMPL
sort(Out)[1:3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多