【问题标题】:For Loop Error - Subscript Out of BoundsFor 循环错误 - 下标越界
【发布时间】:2014-08-31 05:23:24
【问题描述】:

我已经在互联网上搜索了几个小时试图解决以下错误:

Error in Dataset[i, Year] : subscript out of bounds

下面是我的代码产生错误的部分:

for(i in (2*YF):1){
    if(Dataset[i,Year] < 0){
        Dataset[i,Total_Births] <- Dataset[i,Male_Births] + Dataset[i,Female_Births]
    }else{
        Dataset[i,Total_Births] <- with(Dataset, sum(Dataset[Female_Births > (i-AEB) & Female_Births <= (i-ABB),Female_Births]))
        Dataset[i,Male_Births] <- MBR * Dataset[i,Total_Births]
        Dataset[i,Female_Births] <- FBR * Dataset[i,Total_Births]
    }
}

“年份”以 500 开始,以 -500 结束,跳过 0。

我需要从下往上填充列。

任何帮助将不胜感激。

以下是完整代码:

#DECLARE PARAMETERS
YF  <- 500     #Years Ago Flood Occurred
FBR  <- .5       #Historical Female Birth Rate
MBR  <- (1-FBR)  #Historical Male Birth Rate
ABF <- 12       #Average Births per Female
AL  <- 60       #Average Lifespan 
NF  <- 4        #Number of Females at Debark
NM  <- 4        #Number of Males at Debark
NAD <- 40       #Noah's Age at Debark
NWA <- 40       #Emzara's (Noah's Wife) Age at Debark
SA  <- 35       #Shem's (Noah's Son) Age at Debark
SWA <- 35       #Sedeqetelebab's (Shem's Wife) Age at Debark
HA  <- 30       #Ham (Noah's Son) Age at Debark
HWA <- 30       #Ne'elatama'uk's (Ham's Wife) Age at Debark
JA  <- 25       #Japheth (Noah's Son) Age at Debark
JWA <- 25       #Adataneses's (Japheth's Wife) Age at Debark
CP  <- 20       #Current Population of World Today
ABB <- 18       #Age Begin Births
AEB <- 30       #Age End Births


###CREATE MATRIX - YEAR###
YearA <- YF:1
YearB <- -1:-YF

Year <- c(YearA,YearB)

###POPULATE BIRTHS DATA###
BF_Male_Births <- rep.int(0,YF)
BF_Female_Births <- rep.int(0,YF)

BF_Male_Births[NAD] <- 1
BF_Female_Births[NWA] <- 1
BF_Male_Births[SA] <- 1
BF_Female_Births[SWA] <- 1
BF_Male_Births[HA] <- 1
BF_Female_Births[HWA] <- 1
BF_Male_Births[JA] <- 1
BF_Female_Births[JWA] <- 1

BF_Total_Births <- rep.int(0,YF)

AF_Male_Births <- rep.int(0,YF)
AF_Female_Births <- rep.int(0,YF)
AF_Total_Births <- c(rep.int(4,9),rep.int(3,3),rep.int(0,(YF-12))) #make parameters for 9,3,12

Male_Births <- c(AF_Male_Births,BF_Male_Births)
Female_Births <- c(AF_Female_Births,BF_Female_Births)
Total_Births <- c(AF_Total_Births,BF_Total_Births)

Total_Births <- rep.int(0,YF)

Births <- cbind(Male_Births,Female_Births,Total_Births)
Dataset <- cbind(Year,Births)

for(i in (2*YF):1){
  if(Dataset[i,Year] < 0){
    Dataset[i,Total_Births] <- Dataset[i,Male_Births] + Dataset[i,Female_Births]
  }else{
    Dataset[i,Total_Births] <- with(Dataset, sum(Dataset[Female_Births > (i-AEB) & Female_Births <= (i-ABB),Female_Births]))
    Dataset[i,Male_Births] <- MBR * Dataset[i,Total_Births]
    Dataset[i,Female_Births] <- FBR * Dataset[i,Total_Births]
  }
}

【问题讨论】:

  • 你看Dataset了吗?它是一个 4x1 矩阵,填充了 1000。它只有 4 行,您尝试从 1000 索引到 1。另外,您是否在其他地方定义了“Total_Births”、“Male_Births”、“Female_Births”?它的代码也缺少其他变量,因此无法运行。
  • 1)这是一个 1000x2 矩阵 2)"Year","Total_Births","Male_Births","Female_Births" 是列名 3)我不打算让它可运行 - 我可以做到如果你愿意,可以运行
  • 好吧,在上面粘贴的代码中dim(Dataset) 是 4x1。很明显,这不是您所期望的。
  • 它绝对是 1000x4 - 不管我添加了完整的代码并删除了导致混淆的两行。

标签: r loops for-loop matrix subscript


【解决方案1】:

当您执行Dataset[i,Year] 时,i 和 Year 都被视为指标。由于年份是数字,子集运算符假定您希望返回这些列值。但是,Year 是一个值为 500:-500 的向量,并且您只有 4 列,这就是您得到超出范围错误的原因。这有点令人困惑,因为您在矩阵外部定义了一个 Year 向量,并在矩阵内部定义了一个 Year 列。

如果您使用字符向量进行索引,它将匹配行名和列名。所以认为你的意思是

Dataset[i,"Year"]

索引Dataset 的所有其他地方也是如此。现在,没有引号,它使用您在矩阵之外定义的值,这不是您想要的。

此外,您不能将with() 与矩阵一起使用。 with() 应该与 data.frames 或环境或列表一起使用,而 Dataset 不是其中的任何一个。这更接近正确的语法

for(i in (2*YF):1){
  if(Dataset[i,"Year"] < 0){
    Dataset[i,"Total_Births"] <- Dataset[i,"Male_Births"] + Dataset[i,"Female_Births"]
  }else{
    Dataset[i,"Total_Births"] <- sum(Dataset[Dataset[, "Female_Births"] > (i-AEB) & Dataset[,"Female_Births"] <= (i-ABB),"Female_Births"])
    Dataset[i,"Male_Births"] <- MBR * Dataset[i,"Total_Births"]
    Dataset[i,"Female_Births"] <- FBR * Dataset[i,"Total_Births"]
  }
}

但您似乎仍然存在一些逻辑错误。

【讨论】:

  • 现在我收到以下错误:Error in eval(substitute(expr), data, enclos = parent.frame()) : numeric 'envir' arg not of length one
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2017-05-12
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多