3

私は人々のリストを持っています:

people<-c("Betty", "Joe", "Bob", "Will", "Frank")

各人に 2 人をランダムに割り当て (自己割り当ては許可されていません)、各人を別の人に同じ回数割り当てたいです (上記の例では、各人を別の人に 2 回しか割り当てることができません)。 .

たとえば、マッチアップは次のようになります

ベティ (ジョーとボブ)、ジョー (ボブとウィル)、ボブ (ウィルとフランク)、ウィル (フランクとベティ)

もちろん、私はそれらの順序付けを使用しましたが、これをランダム化できればいいと思います。

どこから始めればよいですか?

4

2 に答える 2

3

新しい (より簡単な) 解決策: Ari B. Friedman のパッケージのshift関数を使用するTaRifx

tt <- sample(people)
lapply(seq_len(length(tt))-1, function(x) shift(tt, x)[1:3])
# if you don't want it to be ordered, just add a sample(.)
lapply(seq_len(length(tt))-1, function(x) sample(shift(tt, x)[1:3]))
# [[1]]
# [1] "Bob"   "Frank" "Betty"
# 
# [[2]]
# [1] "Frank" "Betty" "Joe"  
# 
# [[3]]
# [1] "Betty" "Joe"   "Will" 
# 
# [[4]]
# [1] "Joe"  "Will" "Bob" 
# 
# [[5]]
# [1] "Will"  "Bob"   "Frank"

古い解決策(アイデア): 私はこのように行きます。基本的にはsample「人」になったら、1,2,3, 2,3,4, 3,4,5, 4,5,1 といつでも行けます。では、そうしましょう。つまり、これらのインデックスを生成してから、人々をサンプリングしてトリプレットを取得します。

# generate index
len <- length(people)
choose <- 3 # at a time 
idx <- outer(seq(choose), seq(choose+2)-1, '+')
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    2    3    4    5
# [2,]    2    3    4    5    6
# [3,]    3    4    5    6    7

# sample people
tt <- sample(people)
# [1] "Joe"   "Will"  "Bob"   "Frank" "Betty"
max.idx <- 2*choose + 1
tt[(len+1):max.idx] <- tt[seq(max.idx-len)]
# [1] "Joe"   "Will"  "Bob"   "Frank" "Betty" "Joe"   "Will" 

tt[idx]
#  [1] "Joe"   "Will"  "Bob"   "Will"  "Bob"   "Frank" "Bob"   "Frank" "Betty" "Frank" 
#  [15] "Betty" "Joe"  "Betty" "Joe"   "Will" 

split(tt[idx], gl(ncol(idx), nrow(idx)))
# $`1`
# [1] "Joe"  "Will" "Bob" 
# 
# $`2`
# [1] "Will"  "Bob"   "Frank"
# 
# $`3`
# [1] "Bob"   "Frank" "Betty"
# 
# $`4`
# [1] "Frank" "Betty" "Joe"  
# 
# $`5`
# [1] "Betty" "Joe"   "Will" 

これで、これをすべて関数に入れることができます。

my_sampler <- function(x, choose) {
    len <- length(x)
    idx <- outer(seq(choose), seq(choose+2)-1, '+')
    sx  <- sample(x)
    max.idx <- 2*choose + 1
    sx[(len+1):max.idx] <- sx[seq(max.idx-len)]
    split(sx[idx], gl(ncol(idx), nrow(idx)))
}
# try it out
my_sampler(people, 3)
my_sampler(people, 4) # 4 at a time

# if you want this and want a non-ordered solution, wrap this with `lapply` and `sample`

lapply(my_sampler(people, 3), sample)
于 2013-03-22T15:15:34.303 に答える
0

興味深い問題です。これで中途半端になります。欠けているビットは、人々が同数のパートナーシップにいるという制約です. 2人を自分以外の誰かにランダムに割り当てたい場合、これは次のようなワンライナーで実現できます...

assigns <- lapply( people , function(x) { c( x , sample( people[!(people %in% x)] , 2 ) ) } )

最初の人が割り当てられ、最後の 2 人が割り当てられます。

assigns
#[[1]]
#[1] "Betty" "Bob"   "Will" 

#[[2]]
#[1] "Joe"   "Bob"   "Frank"

#[[3]]
#[1] "Bob"   "Betty" "Joe"  

#[[4]]
#[1] "Will"  "Betty" "Joe"  

#[[5]]
#[1] "Frank" "Will"  "Betty"
于 2013-03-22T15:04:47.670 に答える