多對我的人的名單:創建R中
people<-c("Betty", "Joe", "Bob", "Will", "Frank")
我想隨機指定兩個人每個人(自賦值是不允許的),我想分配每個人到另一個等量的時間(在上面的例子中,每個人只能被分配給另一個兩次)。
因此,例如搭配起來可能是
貝蒂(喬和鮑勃),喬(Bob和威爾),鮑勃(威爾和Frank),威爾(弗蘭克和貝蒂)
當然,我中剛剛使用過他們的順序,但如果這可能是隨機的,那將會很好。
任何想法從哪裏開始?
多對我的人的名單:創建R中
people<-c("Betty", "Joe", "Bob", "Will", "Frank")
我想隨機指定兩個人每個人(自賦值是不允許的),我想分配每個人到另一個等量的時間(在上面的例子中,每個人只能被分配給另一個兩次)。
因此,例如搭配起來可能是
貝蒂(喬和鮑勃),喬(Bob和威爾),鮑勃(威爾和Frank),威爾(弗蘭克和貝蒂)
當然,我中剛剛使用過他們的順序,但如果這可能是隨機的,那將會很好。
任何想法從哪裏開始?
新(容易)解決方案:使用shift
功能從TaRifx
包從阿里B.弗裏德曼
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)
有趣的問題。這會讓你在中途停下來。缺少的一點就是人們處於同等數量的合作關係中。如果你想隨機分配兩個人的人,除了自己這個可以在一個襯裏像這樣實現...
assigns <- lapply(people , function(x) { c(x , sample(people[!(people %in% x)] , 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"
但只有4三元返回時,名稱的初始向量是5長時間? – 2013-03-22 15:20:27
OP在他的輸出中只有4個...所以我認爲就是這樣。將進行編輯。 – Arun 2013-03-22 15:21:03
嗯,我明白你的意思了。我認爲名單上的每個人都應該分配一些朋友,所以沒有人會被排除在派對之外! :-) – 2013-03-22 15:23:10