给定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)
给定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)
非常手动,您可以测试每个数是否等于所有其他号码,并检验是否有两个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)
这很自然地变得很慢,数量很高。
基于样本()的替代函数。
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)
这使用table()来快速检查并防止重复。 –
你可以做这样的事情......
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
排除先前的值。
做拒收抽样。 – Roland