生成向量中的随机项对

时间:2018-07-05 08:26:15

标签: r random

假设我有一个字符向量(例如foreach($followers as $follower) { echo $follower->status; } ),我想从该向量中随机生成myv = c('a', 'b', 'c', 'd', 'e')n = length(myv),知道:

  • 所有项目应按随机顺序分别为partner1 - partner2的1倍和partner1的1倍;
  • 一个项目不能与其本身成为伙伴(partner2partner1的保存值不起作用。

我没有找到一种优雅的方式(例如,使用partner2samplecombn),因此我目前使用的是丑陋的expand.grid循环:

for

1 个答案:

答案 0 :(得分:2)

您可以将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]