[英]Random Sample in R: Limiting Number of Repetitionsout of a 2 digit vector
我在 R 中有以下向量:c(0,1)。
我希望一次從這個向量中隨機抽取 10 個元素,但重復的元素不超過 2 個。
我試過的代碼是 sample(c(0,1),10,replace=T)
但我想得到
sample(c(0,1),10,replace=T) = (0,1,1,0,1,1,0,0,1,0)
sample(z,4,replace=T) = (0,1,0,1,0,0,1,0,1,0)
但不是
sample(z,4,replace=T) = (1,0,0,0,1,1,0,0,0)
等等。
我怎么能做到這一點?
由於重復次數只能是 1 或 2,並且值需要交替,因此您可以通過隨機選擇 1 和 0 序列中的每一個的 1 或 2 次重復並截斷結果來實現這一點到 10 個元素。
rep(rep(0:1, 5), times = sample(c(1:2), 10, TRUE))[1:10]
#> [1] 0 0 1 1 0 1 1 0 1 0
如果你想移除總是以零開始的序列的約束,你可以隨機地從 1 中減去結果:
abs(sample(0:1, 1) - rep(rep(0:1, 5), times = sample(c(1:2), 10, TRUE))[1:10])
#> [1] 1 1 0 0 1 0 0 1 1 0
foo <- function(){
innerfunc <- function(){sample(c(0, 1), 10, T)}
x <- innerfunc()
while(max(rle(x)$lengths) > 2){
x <- innerfunc()
}
x
}
foo()
這個 function 將查看零和一序列的最大長度。 如果大於 2,它會重新運行您的sample
function,在此處命名為innerfunc
。
如果您想使用遞歸,我認為這是一種有趣的編碼實踐,下面可能是一個提供一些提示的選項
f <- function(n) {
if (n <= 2) {
return(sample(c(0, 1), n, replace = TRUE))
}
m <- sample(c(1, 2), 1)
v <- Recall(n - m)
c(v, rep((tail(v, 1) + 1) %% 2, m))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.