为数据框中的特定点创建指针

时间:2014-01-17 18:53:53

标签: r loops dataframe

在我了解详细信息之前,项目的一些背景知识。我正在处理约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

1 个答案:

答案 0 :(得分:1)

首先,

存在问题
Clean <- Clean[order(country.isocode),]

(它将使用全局变量country.isocode,而不是数据框中的一个,如果有的话。)

而不是

for (i in 1:length(Codes)) {
assign((Codes[i]),droplevels(subset(Clean,country.isocode==Codes[i])))
}

你可以做到

xyz <- split(Clean, list(country.isocode))  # or, probably Clean$country.isocode

现在您已按国家/地区拆分数据框。您可以lapply一个功能(可能是自制的)到结果列表(xyz),您可以分别获得每个国家/地区的结果。试试这个,然后说你真的需要一个“指针”。

在评论后编辑

xyz <- split(Clean, list(Clean$country.isocode)) 
xyz <- lapply(xyz, droplevels)  # whatever that's for

现在你可以定义你想要对每个国家做什么了(我重写了你的代码而没有试图理解它的作用,但只注意到一个明显的问题):

doit <- function(x){
    # where does the DELTA come from? do you initialize it to zero?
    # anyway, you need to define it here or pass it as argument
    Results <- matrix(numeric(0), 100,2)  # I'd use 0 or NA instead of numeric(0)
    NROWs<-nrow(x)

    for (j in 1:100) {
      x[1,12]<-x[1,9]/DELTA

    for (i in 2:NROWs) {
      x[i,12] <- x[i-1,12]*(1-DELTA)+x[i,9]
    }

   x[,13] <- x[,12]/x[,8]

   Results[j,1] <- DELTA
   Results[j,2] <- sum(x[,13] > 1 & x[,13] < 3)

   DELTA=DELTA+.002
   }
   Results # returns results
   }

现在您可以将新定义的功能应用到列表中:

lapply(xyz, doit)

那应该是它。您可能需要一些修改和试验和错误,但在我看来,这比使用assign创建大量变量更合理。