2016-05-16 33 views
1

我對R相當陌生,並且試圖用R循環來自動化R中的草案。基本上,我想要一個擁有9列(9個隊伍中的每一個)的媒介,並且在該列中選出第一個可用的隊員(所有9支隊伍都有相同的36名球員的不同順序;按每個隊隊長的感覺排名玩家將執行)並將其放入一個空白矩陣,最終將所有團隊完成。For循環R爲蛇吃水?

正如我所說,有9個隊每個起草4名球員。因爲它是一個蛇起草了「採摘令」運行這樣的:

  • 1隊隊長挑選他們的第一選擇,然後
  • 隊長2拿起他們的第一選擇(留下的球員,隊長1的第一個選擇不再可用),然後
  • 隊長3使得他們的第一選擇,

一路

  • 隊長9誰再需要他們的第一個挑選和他們的第二順位,然後
  • 八隊隊長需要他們的第二順位,

這種跟風回

  • 隊長1誰選他們的第二個和第三拾取,

因爲有9名隊長和36名選手選擇從,每個小組具有最終FO你的球員(不重複)。我希望我已經解釋得很好。我喜歡這個網站,並感謝您的幫助!

+0

會'set.seed(1); replicate(9,sample(1:9))'是一個足夠好的數據示例嗎? – thelatemail

+0

非常接近,但是每列有9個數據點,而不是36個。所以這取代了:set.seed(1);重複(9,樣本(1:36)) –

+0

不要認爲任何一種解決方案都有效,因爲(i)複製不會阻止同一玩家被選中兩次,(ii)挑選順序不反映蛇草案。 –

回答

1

這是一個建議的解決方案。不是最優雅的尋找,但應該爲你的問題的工作:

players <- paste0("player", 1:36) 
picks<-sample(players, 36) 
draft <- matrix(NA, ncol=9, nrow=4) 
for(i in 1:4){ 
    if(i %in% c(1,3)) draft[i, 1:9] <- picks[(9*(i-1)+1):(9*(i-1)+ 9)] 
    if(i %in% c(2,4)) draft[i, ] <- rev(picks[(9*(i-1)+1):(9*(i-1)+ 9)]) 
} 


draft 
    [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  
[1,] "player4" "player12" "player29" "player10" "player19" "player26" "player3" "player21" "player20" 
[2,] "player17" "player7" "player9" "player5" "player6" "player23" "player15" "player35" "player13" 
[3,] "player36" "player34" "player28" "player32" "player33" "player27" "player30" "player31" "player8" 
[4,] "player11" "player22" "player2" "player18" "player24" "player25" "player16" "player1" "player14" 
+0

我認爲你錯過了團隊喜好部分。 – alistaire

+1

我想是的。我只是沒有看到任何方式來避免嵌套循環,如果每個球隊的偏好被考慮... –

0

這裏有一個合理的可讀版本:

set.seed(47) 

players <- cbind(replicate(9, sample(1:36)), ID = 1:36) # column 10 is ID column 
pick <- matrix(NA, 4, 9) # matrix to fill 

for(round in 1:4){ 
    direction <- if(round %% 2 == 1) {1:9} else {9:1} 
    for(team in direction){ 
     pick[round, team] <- players[which.min(players[, team]), 'ID'] # store pick 
     players <- players[-which.min(players[, team]), , drop = FALSE] # erase player's row 
    } 
} 

pick # rows are rounds, columns are teams, numbers are player IDs 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
# [1,] 18 5 20 6 27 36 24 34 26 
# [2,] 19 28 32 1 23 33 30 2 17 
# [3,] 21 15 8 9 13 7 35 31 14 
# [4,] 16 3 4 22 10 11 29 25 12 
+0

非常感謝你對此的所有幫助!這產生了一個矩陣,似乎正是我所希望的,但我不清楚ID列的工作原理。每個玩家是否有唯一的ID(第10列?)以及該ID分配在哪裏?所以,例如在你的結果「挑選」矩陣上面;什麼「球員」18代表? –

+0

'ID'只是代表每個玩家的數字,這裏只是1:36。 (如果你喜歡,用名字或者什麼都替換。)「players」是一個團隊喜好矩陣,其中的列表示代表隊員和隊伍的列。 「ID」開始等同於行號(1:36),但如果您要從矩陣中刪除行,則需要單獨的「ID」列,就像這裏所做的一樣;即使行號會像先前的號碼一樣被刪除,你也不希望玩家號碼改變。 – alistaire

+0

這工作,非常感謝! –