2012-08-06 59 views
5

Disculpas por una publicación larga! Soy nuevo en R y he estado trabajando duro para mejorar mi dominio del idioma. Me encontré con este interesante proyecto en los resultados de fútbol de modelado: http://www1.maths.leeds.ac.uk/~voss/projects/2010-sports/JamesGardner.pdfError en * tmp * [[j]]: subíndice fuera de límites

sigo corriendo en problemas cuando corro el código para simular una temporada completa (mencionado en primer lugar la página 36, ​​Apéndice página 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) 

El la respuesta que recibo es

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

Cuando intento una retraza(), esto es lo que me sale:

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

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

1: Games(TeamParameters) 

Realmente no entiendo lo que significa el error y agradecería cualquier ayuda. Una vez más, me disculpo por la publicación larga, pero estoy realmente interesado en este proyecto y me encantaría saber cuál es el problema.

Respuesta

4

Los objetos data.frame no son extensibles por filas con la operación [<-.data.frame. (Debería usar rbind). Debe crear un objeto que tenga suficiente espacio, ya sea una matriz pre-dimensionada o un data.frame. Si "C" es un objeto de 0 filas, entonces intentar asignar a la fila uno fallará. Hay una función llamada "C", por lo que es posible que desee que su nombre sea más distinto. También parece probable que haya métodos más eficientes que el de doble circuito, pero no describió muy bien el objeto del parámetro.

Usted puede notar que el apéndice de ese papel que citó muestra cómo comprobar la validez de la dimensión de una trama de datos:

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

... y los juegos a objetos se supone que tiene ya el número adecuado de filas y los resultados de los cálculos fueron asignar nuevos valores de columna. La operación $<- tendrá éxito si no hay un valor actual para esa columna a la que se hace referencia.

Cuestiones relacionadas