在R中执行for循环
我对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
首先我要为循环超过数据的文件名进行迭代。 特别是在1988年至2006年的1988年是 的地方被放置在有约束力的声明。 x是输入到R中的数据文件 的列表,1988是文件名的一部分。所以,我有从1988,1989,...,2006开始的 文件名。
yield是一个数值向量,我想将向量的索引 输入到循环中所示的函数RMSE2中。对于 示例,在第一次迭代中,我希望使用绑定中的索引1至 的列数。然后对于下一个迭代 我希望第一个索引比先前的迭代 结束的数量多1,并且继续等于下一个绑定 语句中的列数。我只是不知道我写的是否会完成 这个。
最后,我希望将这些结果中的每一个存储在矢量 yearerrors中,然后再访问这个矢量。
非常感谢!
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
我真的不能想象一个能够像这样工作的函数,但它似乎是您的代码的最合理的适应。
谢谢你的耐心亚历克斯,并试图为我构建一个答案。我最终在paste0的帮助下完成了我所需要的。对于这个解释感到抱歉,正如我所说的,我对R很陌生,也许无法解释我到底需要什么。不过谢谢。 – user1836894 2013-02-27 23:22:05
您可以通过将数据放在自己的文件夹中并在其中设置工作目录,然后使用for(在list.files()中进行循环)来保存大量工作......只是对第1部分 – Seth 2013-02-26 22:29:57
嗨,你可能想看看'?as.character'和'paste0'。另外,如果要合并两个单独的范围,请确保在'c(1800:1850,2003:212)' – 2013-02-26 22:32:59
'(1988:1999,2000:2006)'中使用'c()'无效,它需要'c(1988:1999,2000:2006)' – Chase 2013-02-26 22:33:34