在向量中生成随机项对

ztl

假设我有一个字符向量(例如myv = c('a', 'b', 'c', 'd', 'e')),我想从该向量中随机生成n = length(myv)partner1 - partner2,知道:

  • 所有项目应按随机顺序为1次partner1和1次partner2,不得多于或少于;
  • 一个项目不能与它自身成为伙伴(保存值partner1并且partner2不起作用)。

我没有找到一种完美的方法(例如sample,使用combnexpand.grid),因此我目前使用了一个丑陋的for循环:

set.seed(11)

myv = letters[1:5]

irand = sample(length(myv), length(myv)) # to randomly select partner1

allpairs = expand.grid(myv, myv)
# remove pairs of the same item
allpairs = allpairs[allpairs[,1]!=allpairs[,2],]

usedpartner2 = c() # to store the partner2 which are already used
mypairs = c() # to store results
for (i in 1:length(myv)) {
  partner1 = myv[irand[i]]
  # the potential partner2 must be different from partner1 and not already used
  candidates = allpairs[allpairs[, 1]==partner1 & !(allpairs[, 2] %in% usedpartner2), 2]
  partner2 = as.character(candidates[sample(length(candidates), 1)])
  usedpartner2 = c(usedpartner2, partner2)
  mypairs = rbind(mypairs, c(partner1, partner2))
}

mypairs
#      [,1] [,2]
# [1,] "b"  "e" 
# [2,] "a"  "b" 
# [3,] "e"  "a" 
# [4,] "d"  "c" 
# [5,] "c"  "d" 
杰伊

您可以将其myv视为环,并通过在molulo(%%)中添加length(myv)(不包括零)将其随机旋转(length(myv) - 1) %% length(myv)应排除在外,以避免元素与自身配对。这应该myv分别与和的任意长度一起工作

matrix(c(myv, 
         myv[(seq_along(myv) + sample(seq_along(myv)[- (length(myv) - 1)], 1)) 
             %% length(myv) + 1]), 
       ncol=2)

然后,您可以轻松地将其包装为一个函数。

pairOff <- function(x) {
  x <- sample(x)  # to get first column into random order, too
  M <- matrix(c(x, 
                x[(seq_along(x) + sample(seq_along(x)[- (length(x) - 1)], 1)) 
                  %% length(x) + 1]), 
              ncol=2)
  return(M)
}

屈服

> pairOff(myv)
     [,1] [,2]
[1,] "d"  "e" 
[2,] "c"  "a" 
[3,] "b"  "d" 
[4,] "e"  "c" 
[5,] "a"  "b" 

数据

set.seed(165472)
myv <- letters[1:5]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章