R 中的随机样本:限制 2 位向量的重复次数

问题描述 投票:0回答:3

我在 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)

等等。

我怎样才能做到这一点?

r random repeat
3个回答
4
投票

由于重复次数只能是 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

如果你想去掉序列总是从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

1
投票
foo <- function(){
  innerfunc <- function(){sample(c(0, 1), 10, T)}
  x <- innerfunc()
  while(max(rle(x)$lengths) > 2){
    x <- innerfunc()
  }
  x
}

foo()

此函数将查看零和一序列的最大长度。如果该值 > 2,它将重新运行您的

sample
函数,此处名为
innerfunc


1
投票

如果您想使用递归,我认为这是一个有趣的编码实践,下面可能是一个提供一些提示的选项

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))
}
© www.soinside.com 2019 - 2024. All rights reserved.