2014-07-10 116 views
-2

的我一直在寻找了几个小时的互联网试图解决以下错误:For循环错误 - 下标出界

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] 
    } 
} 

'Year'开始于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] 
    } 
} 
+0

你看过'数据集'吗?它是4x1矩阵,填充1000.它只有4行,你试图索引从1000到1.你是否在其他地方定义了“Total_Births”,“Male_Births”,“Female_Births”?它的代码缺少其他变量,所以它不能运行。 – MrFlick

+0

1)它是一个1000x2的矩阵2)“Year”,“Total_Births”,“Male_Births”,“Female_Births”是列名称3)我不打算将它运行 - 如果你想 – JTeezee

+0

我可以让它运行好吧,在你粘贴在dim(数据集)上面的代码中是4x1。很明显,这不是你所期望的。 – MrFlick

回答

0

当你这样做Dataset[i,Year],既iYear被视为indicies。由于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"] 
    } 
} 

但似乎你可能仍然存在一些逻辑错误。

+0

现在我收到以下错误:'eval中的错误(替代(expr),数据,enclos = parent.frame()): numeric'envir'arg not of one one' – JTeezee