2017-08-25 12 views
1

4つの数値オブジェクトが指定されています。サンプルを複製して重複を許可しますが、行内に2回出現するときは重複を許可しません。

df<-data.frame(a=1:5, b=6:10, c=11:15, d=16:20) 

これらのオブジェクトから値をサンプリングして、同じ値を2回連続して取得しないで重複を許可するにはどうすればよいでしょうか?

ないOK:

7, 3, 3, 12, 17 (two 3's in a row) 

OK:非常に手動で

17, 3, 7, 2, 7 (duplicates, but no value appears twice in a row) 
+2

拒否サンプリング。 – Roland

答えて

1

が、あなたは、それぞれの数は、他のすべての数字に等しいかどうかをテストし、行に2 TRUE年代があるかどうかをテストすることができますし、それに基づいて、条件がFALSEになるまでサンプリングを繰り返します。

このような機能で実装することができます。

sampler <- function(number_sample) { 
    x <- sample(1:number_sample, replace = TRUE) 
    pre_test <- lapply(x, function(single_number) diff(which(single_number == x)) == 1) 
    test <- any(sapply(pre_test, any)) 

    if (test) sampler(number_sample) else x 
} 

sampler(100) 
sampler(10) 

これは当然、数値が大きいほど非常に遅くなります。

0

サンプル()に基づく代替機能。 sapplyループは除くvaluesから、そのたびにサンプルを進むにつれて

custom.sampling <- function(pool, elems) { 
    # arg check 
    if ((!is.vector(pool))| 
    elems < 2) 
    stop("Bad params") 

    #init and proceed 
    tmp <- c(1,1) 
    while (sum(table(tmp) == 2) >0){ 
    tmp <- sample(pool, size = elems, replace = T) 
    } 
    return(tmp) 
} 

pool <- 0:9 
elems <- 5 
custom.sampling(pool, elems) 
+0

これは、テーブル()を使用して重複を迅速にチェックし、防止します。 –

0

あなたはこのような何かを行うことができ...

values <- 1:4 #values to sample from 
len <- 20 #number of samples 
samp <- sample(values,1) #initialise variable 
length(samp) <- len 
sapply(2:len, function(i) samp[i] <<- sample(setdiff(values, samp[i-1]), 1)) 

samp 
[1] 2 1 4 1 4 3 2 4 3 1 3 1 4 3 4 1 3 1 4 2 

<<-オペレータは、地球環境におけるsampの値を変更します前の値。

関連する問題