0

我对 R 很陌生,并且有几个关于我正在尝试执行的循环的问题。我将尝试尽可能地解释自己,并注意我希望循环做什么。

for(i in (1988:1999,2000:2006)){
    yearerrors=NULL
    binding=do.call("rbind.fill",x[grep(names(x), pattern ="1988.* 4._ data=")])
    cmeans=lapply(binding[,2:ncol(binding)],mean)
    datcmeans=as.data.frame(cmeans)
    finvec=datcmeans[1,]
    kk=0
    result=RMSE2(yields[(kk+1):(kk+ncol(binding))],finvec)
    kk=kk+ncol(binding)
    yearerrors=c(result)
}

yearerrors
  1. 首先,我希望循环遍历数据的文件名。特别是在 1988-2006 年间,在约束性声明中现在放置 1988 的地方。x 是输入到 R 中的数据文件列表,1988 是文件名的一部分。所以,我的文件名以 1988,1989,...,2006 开头。

  2. yield 是一个数字向量,我想将向量的索引输入到函数 RMSE2 中,如循环中所示。例如,在第一次迭代中,我希望使用索引 1 到绑定中的列数。然后对于下一次迭代,我希望第一个索引比上一次迭代结束的多 1,并继续到等于下一个绑定语句中的列数的数字。我只是不知道我所写的是否能做到这一点。

  3. 最后,我希望将这些结果中的每一个存储在向量 yearerrors 中,然后再访问该向量。

提前非常感谢!

4

1 回答 1

1

好的,这里有很多猜测,因为你的数据结构非常不清楚,我不知道 RMSE2 函数是什么(你也没有给出细节)。根据您前几天的问题,我将假设您的数据位于 .csv 文件中。我要对你的问题进行一番探讨。

我将首先在读取文件时构建组合数据框,而不是先做一个然后再做另一个。像这样:

#Set your working directory to the folder containing the .csv files
#I'm assuming they're all in the form "YEAR.something.csv" based on your pattern matching

filenames <- list.files(".", pattern="*.csv") #if you only want to match a specific year then add it to the pattern match
years <- gsub("([0-9]+).*", "\\1", filenames)

df <- mdply(filenames, read.csv)
df$year <- as.numeric(years[df$X1]) #Adds the year
#Your column mean dataframe didn't work for me
cmeans <- as.data.frame(t(colMeans(df[,2:ncol(df)])))

然后就很难知道你想要实现什么。由于您datcmeans是单行 data.frame,datcmeans[1,]因此不会改变任何内容。因此,如果数据框(或数字向量)中的一行是您的RMSE2函数所需的参数,您可以传递它datcmeanscmeans在我的示例中)。

从那时起,您的代码对我来说几乎是难以理解的。不知道是什么yields样子,或者 RMSE2 是如何工作的,几乎不可能提供更多帮助。

如果你要在这里做一个循环,我会说kk=kk+ncol(binding)在第一次迭代结束时设置对你没有帮助,因为你已经设置kk=0了 , kk 不会等于 ,也就是说ncol(binding),我我猜,不是你想要的。这是我对您在这里需要的猜测(假设需要循环)。

yearerrors=vector("numeric", ncol(df)) #Create empty vector ahead of loop

for(i in 1:ncol(df)) {
  yearerrors[i] <- RMSE2(yields[i:ncol(df)], finvec)
}
yearerrors

老实说,我无法想象像这样工作的函数,但这似乎是您的代码最合乎逻辑的改编。

于 2013-02-26T23:27:50.917 回答