2014-04-03 157 views
-1

我需要爲我在R中模擬足球比賽的循環寫一個long if語句。目前我使用這段代碼模擬比賽複雜if語句

mod3=glm(formula = Score ~ as.factor(Attack) + as.factor(Defence) +as.factor(Home)+Division, family = poisson, data = football) 
for (i in 1:92){ 
for (j in 1:92){ 
    if (i!=j){ 
    teamHome=levels(football$Attack)[i] 
    teamAway=levels(football$Attack)[j] 
    homeScore=rpois(1,predict.glm(mod3, data.frame(Attack=teamHome,Defence=teamAway,Home="Y "),type="response")) 
    awayScore=rpois(1,predict.glm(mod3, data.frame(Attack=teamAway,Defence=teamHome,Home="N "),type="response")) 
    Result= if(homeScore>awayScore){ 
    Result="H" 
} else if(homeScore<awayScore){ 
Result="A" 
}else if(homeScore==awayScore){ 
Result="D" 
} 


results<-print(paste(teamHome,homeScore,"  ",teamAway,awayScore,Result),quote=F) 
} 
} 
} 

的結果目前從我的泊松迴歸幫助進攻,防守和家庭的分數模擬的結果。然而,我需要添加另一個因子「分區」,如果上半場(46)隊中的任何一個被模擬爲對方的「teamHome」和「teamAway」,我會返回「S」的「分區」響應,並且如果底部46個團隊被模擬反對彼此,我返回「師」響應「S1」。我怎麼會encorporate這在我環路下面是我對teamHome和teamAway水平參考

[1] "Manchester United  " "Manchester City  " "Chelsea    " 
[4] "Arsenal    " "Tottenham    " "Everton    " 
    [7] "Liverpool    " "WBA     " "Swansea    " 
[10] "West Ham    " "Norwich    " "Fulham    " 
[13] "Stoke     " "Southampton   " "Aston Villa   " 
[16] "Newcastle    " "Sunderland   " "Wigan     " 
[19] "Reading    " "QPR     " "Cardiff    " 
[22] "Hull     " "Watford    " "Brighton    " 
[25] "Crystal Palace  " "Leicester    " "Bolton    " 
[28] "Nottingham Forest  " "Charlton    " "Derby     " 
[31] "Burnley    " "Birmingham   " "Leeds     " 
[34] "Ipswich    " "Blackpool    " "Middlesbrough   " 
[37] "Blackburn    " "Sheffield Wednesday " "Huddersfield   " 
[40] "Millwall    " "Barnsley    " "Peterborough   " 
[43] "Wolves    " "Bristol City   " "Doncaster    " 
[46] "Bournemouth   " "Brentford    " "Yeovil    " 
[49] "Sheffield United  " "Swindon    " "Leyton Orient   " 
[52] "Milton Keynes Dons " "Walsall    " "Crawley    " 
[55] "Tranmere    " "Notts County   " "Crewe     " 
[58] "Preston    " "Coventry    " "Shrewsbury   " 
[61] "Carlisle    " "Stevenage    " "Oldham    " 
[64] "Colchester   " "Scunthorpe   " "Bury     " 
[67] "Hartlepool   " "Portsmouth   " "Gillingham   " 
[70] "Rotherham    " "Port Vale    " "Burton    " 
[73] "Cheltenham   " "Northampton   " "Bradford    " 
[76] "Chesterfield   " "Oxford    " "Exeter    " 
[79] "Southend    " "Rochdale    " "Fleetwood    " 
[82] "Bristol Rovers  " "Wycombe    " "Morecambe    " 
[85] "York     " "Accrington   " "Torquay    " 
[88] "AFC Wimbledon   " "Plymouth    " "Dagenham and Redbridge" 
[91] "Barnet    " "Aldershot    " 

如果你覺得你能幫助或有任何不清楚我的解釋,需要解釋請向爲我急需您的幫助上這個。我的數據集的形式

例如

Attack    Defence     Score Home Division 
1 Chelsea    Aston Villa    8 Y S     
2 Arsenal    Reading     4 N S     
3 Arsenal    Newcastle     7 Y S     
4 Port Vale    Burton      7 Y S     
5 Liverpool    Newcastle     6 N S     
6 Watford    Leeds      6 N S     

感謝

史蒂夫

+0

你能不能簡單地初始化'division < - factor(「既不」,levels = c(「S」,「S1」,「既不」),然後設置'if(max(i,j)<= 46)division [1] < - 「S」'和'if(min(i,j)> 46)division [1] < - S1'如果球隊不是來自同一半桌子的話,希望進行比賽,同樣,列表中的第7項出現在錯誤的地方;) –

+0

@GavinKelly嗨加文,感謝我的迴應,我試圖用上半場,下半部分作爲一個例子來說明所需要的if語句,因爲不知道大多數人會理解足球桌。但實際上我也需要一個分區迴應,其中排名前20的對陣20-44(例如英超和冠軍)以及聯賽之間的所有其他組合。任何想法如何格式化?抱歉關於肝臟放置我使用去年的數據! – StephenDakin

+0

@mvw上半部分意味着前面輸出的前46名球隊 – StephenDakin

回答

0

忽略我原來的崗位最後的評論 - 我現在從你的榜樣,你有兩個師見在每一行中,連接成單個字符串。所以你可以提取相關內分標籤:

homeDiv <- substr(football$division[football$Attack==teamHome][1], 1, 1) 
awayDiv <- substr(football$division[football$Attack==teamAway][1], 1, 1) 
homeScore <- rpois(..., data.frame(..., division = sprintf("%s%s", homeDiv, awayDiv) ...) ...) 

所以第一行中提取任意的第一個字符(我選擇了第一 - 但他們都應該有相同的第一個字符)排在那裏進攻隊是選擇的主隊。同樣的客隊。然後我們連接它們以獲得相關的主頁:客場比賽對比

+0

謝謝你,很快就會運行它 – StephenDakin

+0

嗨加文,R沒有識別分區的字符串值。與在mod2中找到的係數錯誤在model.frame.default(術語,newdata,na.action = na.action,xlev = object $ xlevels): 因子司有新的水平SS – StephenDakin

+0

所以我猜_S_代表任何分區匹配,而_P1_表示分區之間。你可以在三行之前嘗試'ind < - nchar(football $ division)!= 1'。然後將'== teamHome'改爲'== teamHome&ind',並在下一行中同樣插入'&ind'。最後,在homeScore分配之前,添加一行'if(homeDiv == AwayDiv){homeDiv < - 「S」; awayDiv < - 「」}'。 –