2012-08-06 22 views
5

Entschuldigung für lange Post! Ich bin neu in R und habe hart daran gearbeitet, meine Beherrschung der Sprache zu verbessern. Ich stolperte über dieses interessante Projekt zur Modellierung Fußballergebnisse: http://www1.maths.leeds.ac.uk/~voss/projects/2010-sports/JamesGardner.pdfFehler in * tmp * [[j]]: Index außerhalb der Grenzen

ich Probleme am Laufen halten, wenn ich den Code ausführen eine komplette Saison zu Simulieren (erste erwähnt Seite 36, Anhang Seite 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) 

Die Antwort, die ich erhalten

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

ist, wenn ich einen Traceback() versuchen, ist das, was ich bekommen:

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

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

1: Games(TeamParameters) 

Ich verstehe nicht wirklich, was der Fehler bedeutet, und ich würde jede Hilfe zu schätzen wissen. Noch einmal, Entschuldigung für den langen Post, aber ich bin wirklich interessiert an diesem Projekt und würde gerne lernen, was das Problem ist!

Antwort

4

Die data.frame-Objekte können nicht mit der -Operation um eine Zeile erweitert werden. (Sie müssten rbind verwenden.) Sie sollten ein Objekt erstellen, das über ausreichend Speicherplatz verfügt, entweder über eine vordimensionierte Matrix oder data.frame. Wenn "C" ein Objekt mit 0 Zeilen ist, wird der Versuch fehlschlagen, der ersten Zeile zuzuordnen. Es gibt eine Funktion namens "C", also möchten Sie vielleicht den Namen etwas deutlicher machen. Es scheint auch wahrscheinlich, dass es effizientere Methoden als die Doppelschleife gibt, aber Sie haben das Parameterobjekt nicht sehr gut beschrieben.

Sie werden feststellen, dass der Anhang dieses Papiers zeigt zitiert, wie ein Datenrahmen vorab dimensionieren:

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

... und die Spiele-Objekt angenommen haben bereits die richtige Anzahl der Zeilen und Die Ergebnisse der Berechnungen weisen neue Spaltenwerte zu. Die Operation $<- wird erfolgreich ausgeführt, wenn für diese referenzierte Spalte kein aktueller Wert vorhanden ist.

Verwandte Themen