错误:* tmp * [[j]]:下标越界。

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)

我真的不太明白这个错误是什么意思,希望能得到帮助。再次道歉发了这么长的帖子,但我对这个项目非常感兴趣,希望能学习一下问题在哪里!

1个回答

4

数据框对象不能使用[<-.data.frame操作来按行进行扩展。(您需要使用rbind。)您应该创建一个具有足够空间的对象,可以是预先尺寸调整好的矩阵或数据框。如果"C"是一个0行的对象,则尝试分配到第一行将失败。有一个名为"C"的函数,所以您可能希望将其名称更改为更具有区别性的名称。另外,似乎存在比双重循环更有效的方法,但您没有很好地描述参数对象。

您可能会注意到,您引用的那篇论文的附录展示了如何预先确定数据框的尺寸:

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

假设games-object已经有了正确数量的行,计算结果会分配新的列值。如果没有当前引用列的值,则$<-操作将成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接