5

長文失礼!私は R を初めて使用し、言語のコマンドを改善するために一生懸命取り組んできました。サッカーの結果をモデル化するこの興味深いプロジェクトを見つけました: http://www1.maths.leeds.ac.uk/~voss/projects/2010-sports/JamesGardner.pdf

フルシーズンをシミュレートするコードを実行すると、問題が発生し続けます (最初に言及された 36 ページ、付録 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)

私が得る応答は

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

traceback() を試みると、次のようになります。

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

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

1: Games(TeamParameters)

エラーの意味がよくわかりません。助けていただければ幸いです。繰り返しになりますが、長い投稿で申し訳ありませんが、私はこのプロジェクトに本当に興味があり、問題が何であるかを知りたいです!

4

1 に答える 1

4

data.frame オブジェクトは、[<-.data.frame操作で行ごとに拡張できません。( を使用する必要がありますrbind。)事前にディメンション化されたマトリックスまたは data.frame のいずれかで、十分なスペースがあるオブジェクトを作成する必要があります。"C" が 0 行のオブジェクトである場合、行 1 に割り当てようとすると失敗します。「C」という名前の関数があるので、その名前をもっとわかりやすいものにしたいと思うかもしれません。また、二重ループよりも効率的な方法があるようですが、パラメーターオブジェクトについて十分に説明していません。

引用した論文の付録に、データフレームを事前にディメンション化する方法が示されていることに気付くかもしれません。

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

...そして、games-object には既に適切な数の行があると想定され、計算の結果は新しい列の値を割り当てていました。その$<-参照列に現在の値がない場合、操作は成功します。

于 2012-08-06T16:15:07.447 に答える