【问题标题】:Error in *tmp*[[j]] : subscript out of bounds*tmp*[[j]] 中的错误:下标越界
【发布时间】:2012-08-03 15:08:36
【问题描述】:

为长篇道歉!我是 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)

我真的不明白错误的含义,如果能提供任何帮助,我将不胜感激。再次为这篇长文道歉,但我对这个项目真的很感兴趣,很想知道问题出在哪里!

【问题讨论】:

    标签: r subscript


    【解决方案1】:

    data.frame 对象不能通过[&lt;-.data.frame 操作按行扩展。 (您需要使用rbind。)您应该创建一个具有足够空间的对象,可以是预先确定尺寸的矩阵或data.frame。如果“C”是 0 行的对象,则尝试分配给第一行将失败。有一个名为“C”的函数,因此您可能想让它的名称更加独特。似乎还有比双循环更有效的方法,但是您没有很好地描述参数对象。

    您可能会注意到,您引用的那篇论文的附录显示了如何预先标注数据框:

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

    ... 并且游戏对象被假定已经具有适当的行数,并且计算结果正在分配新的列值。如果引用的列没有当前值,$&lt;- 操作将成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2014-08-31
      相关资源
      最近更新 更多