2017-08-25 49 views
1

给定4个数字对象,例如:取样并允许重复,但不能在连续出现两次时出现

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

如何处理来自这些对象的样本值,允许重复,而不是连续两次获取相同的值?

不正常:

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

确定:

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

做拒收抽样。 – Roland

回答

1

非常手动,您可以测试每个数是否等于所有其他号码,并检验是否有两个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

基于样本()的替代函数。

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

这使用table()来快速检查并防止重复。 –

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在全球环境中的值作为sapply循环的进行,所以每一次样本values排除先前的值。