【发布时间】:2014-02-07 05:46:53
【问题描述】:
在了解详细信息之前,先了解一下该项目的背景。我正在处理约 50 个国家/地区的列表,每个国家/地区的数据在 40 到 60 年之间。我已经能够为单个国家/地区设置一个循环,它会尝试变量的各种值(在代码中名为 DELTA)并记录结果。
我首先引入数据并将其清理为没有空值,然后使用以下代码创建一个包含用于表示每个国家/地区的所有 3 个字母代码的向量。
Clean <- na.omit(Data)
Clean <- Clean[order(country.isocode),]
Codes <- levels(Clean[,2])
然后我使用循环和子集函数为每个国家/地区创建不同的数据框。
for (i in 1:length(Codes)) {
assign((Codes[i]),droplevels(subset(Clean,country.isocode==Codes[i])))
}
现在我所有的 50 个国家都在他们自己的数据框中,以他们的 3 个字母 ISO 代码命名。以下是我运行的代码,用于为安哥拉 (AGO) 创建我想要的结果。
AGO_Results <- matrix(numeric(0), 100,2)
AGOROW<-nrow(AGO)
for (j in 1:100) {
AGO[1,12]<-AGO[1,9]/DELTA
for (i in 2:AGOROW) {
AGO[i,12] <- AGO[i-1,12]*(1-DELTA)+AGO[i,9]
}
AGO[,13] <- AGO[,12]/AGO[,8]
AGO_Results[j,1] <- DELTA
AGO_Results[j,2] <- sum(AGO[,13] > 1 & AGO[,13] < 3)
DELTA=DELTA+.002
}
在此 AGO_Results 的末尾包含我想要的值,但我不想为 50 个国家/地区手动执行此操作,因此我试图为所有 50 个国家/地区创建一个循环。我已经设法使用 eval() 和 assign() 取得了相当大的进展,但我被困在我认为的最后一个障碍上。
for (k in 1:length(Codes)) {
# Initialize Delta and Create Storage Matrix and Row Count
DELTA <- .01
assign(paste(Codes[k],"_Results", sep=""), matrix(numeric(0), 100,2))
assign(paste(Codes[k],"ROW",sep=""), nrow(eval(as.name(Codes[k]))))
这部分是完整的并且有效。现在我们遇到了真正的问题,如何引用要写入每个数据帧的单个点 [1,12]。当我每次都必须粘贴数据框的名称时,我可以做些什么来创建一个指针来替换数据框中的单个项目?
编辑:下面发布的示例数据
country country.isocode year POP rgdpl ki rgdpl2wok rgdp investment workers L.P
21 Angola AGO 1970 5605.63 2366.51 23.27 5904.14 13265745651 3087431388 2246856 0.4
22 Angola AGO 1971 5752.96 2445.13 23.25 6127.95 14066747655 3270057880 2295508 0.4
【问题讨论】:
-
你为什么要把它分成 50 个单独的数据框?这可能没有必要。您可能也不需要循环。你能发布一些示例数据吗?
-
我添加了示例数据。由于每个国家/地区的年份长度不同,并且我要应用的函数是递归的,我认为很难让它在每个国家/地区的正确位置开始和停止。
-
您根本不需要在正确的地方开始和停止,也不需要考虑正确的地方。使用拆分。
?split -
当我最初使用 split 功能时,我无法droplevels。
-
好的,但是你确定你需要droplevels吗?您可以将相关变量转换为字符(使用 as.character)。是的,您可以使用 droplevels - 不是直接在列表中,但您可以
lapply将其添加到列表中。类似xxx <- lapply(split(x, list(x$Country)), droplevels)