我在 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
如果你想去掉序列总是从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()
此函数将查看零和一序列的最大长度。如果该值 > 2,它将重新运行您的
sample
函数,此处名为 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))
}