R:如何在不替换且不连续的相同值的情况下进行采样

Coo*_*ons 10 r sample

我花了整整一天的时间来完成似乎很简单的事情。我必须创建300个“随机”序列,其中数字1,2、3和4都恰好出现12次,但是相同的数字永远不会“连续”使用两次。

我最好的尝试是:

  1. 有R个样本,其中48个项目没有替换,请使用rle测试是否存在连续值,然后仅使用不包含连续值的序列。问题:几乎没有符合此标准的随机序列,因此要花很长时间。

  2. 具有R个创建序列而没有连续值(请参见代码)。

pop<-rep(1:4,12)
y=c()
while(length(y)!=48)
  {
  y= c(y,sample(pop,48-length(y),replace=F))
  y=y[!c(FALSE, diff(y) == 0)]
  }
Run Code Online (Sandbox Code Playgroud)

问题:这将创建每个值具有不同数量的序列。然后,我尝试仅使用每个值正好为12的那些序列,但这仅使我回到问题1:花了很长时间。

必须有一些简单的方法来执行此操作,对吗?任何帮助是极大的赞赏!

jay*_*.sf 3

也许使用replicate()循环repeat会更快。这是一个序列示例3。看起来这需要大约。1490 秒300(未测试)。

set.seed(42)
seqc <- rep(1:4, each=12)  # starting sequence

system.time(
  res <- replicate(3, {
    repeat {
      seqcs <- sample(seqc, 48, replace=FALSE) 
      if (!any(diff(seqcs) == 0)) break
    }
    seqcs
  })
)
#  user  system elapsed 
# 14.88    0.00   14.90 

res[1:10, ]
#       [,1] [,2] [,3]
#  [1,]    4    2    3
#  [2,]    1    1    4
#  [3,]    3    2    1
#  [4,]    1    1    4
#  [5,]    2    3    1
#  [6,]    4    1    2
#  [7,]    3    4    4
#  [8,]    2    1    1
#  [9,]    3    4    4
# [10,]    4    3    2
Run Code Online (Sandbox Code Playgroud)