2013-02-26 86 views
0

我对R很新,有几个关于我试图执行的循环的问题。我会尽可能地尽我所能解释我希望循环做什么。在R中执行for循环

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中,然后再访问这个矢量。

非常感谢!

+1

您可以通过将数据放在自己的文件夹中并在其中设置工作目录,然后使用for(在list.files()中进行循环)来保存大量工作......只是对第1部分 – Seth 2013-02-26 22:29:57

+1

嗨,你可能想看看'?as.character'和'paste0'。另外,如果要合并两个单独的范围,请确保在'c(1800:1850,2003:212)' – 2013-02-26 22:32:59

+0

'(1988:1999,2000:2006)'中使用'c()'无效,它需要'c(1988:1999,2000:2006)' – Chase 2013-02-26 22:33:34

回答

1

OK,有很多猜测这里的挫折感,因为你的数据结构非常清楚,我不知道该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是一行数据帧,因此datcmeans[1,]不会更改任何内容。因此,如果从数据帧(或数字载体)一一行是您RMSE2功能所需的参数,你可以通过它datcmeans(在我的例子cmeans)。

你的代码对我来说是非常难以理解的。如果不知道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 

我真的不能想象一个能够像这样工作的函数,但它似乎是您的代码的最合理的适应。

+0

谢谢你的耐心亚历克斯,并试图为我构建一个答案。我最终在paste0的帮助下完成了我所需要的。对于这个解释感到抱歉,正如我所说的,我对R很陌生,也许无法解释我到底需要什么。不过谢谢。 – user1836894 2013-02-27 23:22:05