2012-08-06 38 views
5

Scuse per post lunghi! Sono nuovo di R e ho lavorato duramente per migliorare la mia padronanza della lingua. Mi sono imbattuto in questo interessante progetto sui risultati di modellazione di calcio: http://www1.maths.leeds.ac.uk/~voss/projects/2010-sports/JamesGardner.pdfErrore in * tmp * [[j]]: indice fuori limite

continuo a incorrere in problemi quando si esegue il codice per simulare una stagione completa (prima citato a pagina 36, ​​appendice pagina 59):

Games <- function(parameters) 

{ 
teams <- rownames(parameters) 
P <- parameters$teams 
home <- parameters$home 
n <- length(teams) 
C <- data.frame() 
row <- 1 
for (i in 1:n) { 
    for (j in 1:n) { 
    if (i != j) { 
C[row,1] <- teams[i] 
C[row,2] <- teams[j] 
C[row,3] <- rpois(1, exp(P[i,]$Attack - P[j,]$Defence + home)) 
C[row,4] <- rpois(1, exp(P[j,]$Attack - P[i,]$Defence)) 
row <- row + 1 
    } 
    } 
} 
return(C) 
} 

Games(TeamParameters) 

Il risposta che ottengo è

Error in `*tmp*`[[j]] : subscript out of bounds 

Quando tento un traceback(), questo è quello che ottengo:

3: `[<-.data.frame`(`*tmp*`, row, 1, value = NULL) at #11 

2: `[<-`(`*tmp*`, row, 1, value = NULL) at #11 

1: Games(TeamParameters) 

Non capisco veramente cosa significhi l'errore e gradirei qualsiasi aiuto. Ancora una volta, mi scuso per il post lungo ma sono davvero interessato a questo progetto e mi piacerebbe sapere qual è il problema!

risposta

4

Gli oggetti data.frame non sono estendibili per riga con l'operazione [<-.data.frame. (È necessario utilizzare rbind.) È necessario creare un oggetto con spazio sufficiente, una matrice pre-dimensionata o data.frame. Se "C" è un oggetto di 0 righe, il tentativo di assegnarsi alla riga uno fallirà. C'è una funzione chiamata "C", quindi potresti voler rendere il suo nome qualcosa di più distinto. Sembra anche probabile che esistano metodi più efficienti rispetto al doppio ciclo, ma non hai descritto molto bene l'oggetto parametro.

Si può notare che l'appendice di quella carta ha citato mostra come pre-dimensionare un dataframe:

teams <- sort(unique(c(games[,1], games[,2])), decreasing = FALSE) 
T <- data.frame(Team=teams, ...) 

... ei giochi-oggetto è stato assunto ad avere già il numero corretto di righe e i risultati dei calcoli stavano assegnando nuovi valori di colonna. L'operazione $<- avrà esito positivo se non ci sono valori correnti per quella colonna referenziata.

Problemi correlati