我在 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)
等等。
我怎么能做到這一點?
uj5u.com熱心網友回復:
由于重復次數只能是 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
uj5u.com熱心網友回復:
foo <- function(){
innerfunc <- function(){sample(c(0, 1), 10, T)}
x <- innerfunc()
while(max(rle(x)$lengths) > 2){
x <- innerfunc()
}
x
}
foo()
此函式將查看 0 和 1 序列的最大長度。如果大于 2,它將重新運行您的sample函式,在此處命名innerfunc。
uj5u.com熱心網友回復:
如果您想使用遞回,我認為這是一種有趣的編碼實踐,下面可能是一個提供一些提示的選項
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))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446279.html
下一篇:R中的互資訊回圈
