-->

在* TMP错误* [J]]:下标越界(Error in *tmp*[[j]] : subscrip

2019-09-20 21:19发布

道歉很长的帖子! 我是新来的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 

当我尝试回溯(),这是我得到:

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

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

1: Games(TeamParameters)

我真的不明白是什么错误意味着,我希望得到任何帮助。 再次,道歉长职位,但我对这个项目很感兴趣,很想了解是什么问题!

Answer 1:

的data.frame对象不是可伸展通过与行[<-.data.frame操作。 (您可能需要使用rbind 。)你应该创建一个具有足够的空间物体,无论是预尺寸矩阵或data.frame。 如果“C”为0行的对象,然后试图分配到排一会失败。 有一个名为“C”的功能,所以你可能要做出自己的名字更多的东西不同。 这也很可能是有更有效的方法比双循环,但还没有描述参数对象非常好。

您可能会注意到该文件的附录你引用展示了如何预标注一个数据帧:

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

...并假设游戏对象已经有行适当数量和计算的结果分配新的列值。 在$<-如果对于所引用列中没有电流值的操作将会成功。



文章来源: Error in *tmp*[[j]] : subscript out of bounds
标签: r subscript