簡體   English   中英

R 中的隨機樣本:限制 2 位向量的重復次數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM