2015-01-08 98 views
-1

我的問題很奇怪,我猜。 我想爲我的大學排球隊制定一個時間表,我決定通過R來做。我有21支球隊,每週都有16支球隊參加比賽。如果一些球隊有不同數量的比賽,這並不重要,因爲我們將看看平均成績。訂購R重新啓動功能

所以我創建了一個很簡單的功能:

play<-function(group){ for (i in 1:1){ playing<-sample(group,16) in1<-sort(playing) in2<-sample(playing) if(sum(in1==in2)==0){ games<-rbind(in1,in2) } if(sum(in1==in2)!=0){ i<-i-1 } } return(games) }

什麼是我的問題嗎? R不幫助我!如果兩個向量in1和in2在至少一個位置上彼此相等,則它不會再次運行該函數。你們有什麼想法,爲什麼?你有什麼想法我可以解決這個問題嗎?

玩是本週比賽的球隊。 (其中只有16人蔘加) 組將以隊名爲向量...(您可以使用A,B,C,D作爲示例) 樣本(玩)只是隨機化16個選擇的向量團隊。當in1和in2在任何空間都不匹配時,我們可以讓這兩個對進行播放。在檢查時,問題就來了。 :/

任何人都可以幫助我嗎?謝謝

+3

'for(i in 1:1)'只會運行一次。你可能需要「時間」,但我相信有一個更好的方法來做到這一點。 – thelatemail

+0

您是否想制定一個16場比賽的時間表,其中16場比賽的每場比賽都有兩場比賽。在一場比賽中,球隊出現在第一列(在家打球?),另一場出現在第二列(打球?)?所以你想產生一個(1:16)的排列,使得排列的第n個元素不是'n'? – Spacedman

回答

0

您的功能通常非常複雜。僅僅先抽取16支隊伍然後讓他們互相比賽是不夠的?試試這個:

play <- function(group){ 
    playing <- sample(group, 16) 
    # if you have 16 teams, you really just have 8 games... 
    games <- rbind(playing[1:8], 
       playing[9:16]) 
    return(games) 
} 
play(LETTERS[1:21]) 
0

1的排列:N,使得沒有置換的是在同一個地方被稱爲「紊亂」:http://mathworld.wolfram.com/Derangement.html

所以,如果你有16支球隊,並希望安排16場比賽中,每個球隊在主場和客場比賽中都有一次出場並且不會自己出場,所以需要計算出一場混亂。

因此,在rdocumentation.org上搜索並在PerMallow軟件包中有一個函數。

install.packages("PerMallow") 
require(PerMallow) 

然後你就可以生成一個紊亂(這裏的大小6),因此,作爲一個行矩陣:

r.derangement(1,6) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 4 1 5 3 6 2 

因此,對於五支球隊命名爲A到E:

> teams = LETTERS[1:5] 
> teams 
[1] "A" "B" "C" "D" "E" 

您將團隊名稱與團隊名稱綁定排列,您可以從1行矩陣的第一行獲取團隊名稱:

> cbind(teams, teams[r.derangement(1,5)[1,]]) 
    teams  
[1,] "A" "E" 
[2,] "B" "C" 
[3,] "C" "A" 
[4,] "D" "B" 
[5,] "E" "D"