如何在R中按顺序运行代码几行代码时避免使用for循环

时间:2013-01-09 15:47:28

标签: r

如果可能的话,我试图避免使用for循环。这是整个代码,矩阵的数据只是百分比。

x.r = read.zoo("Matrix.csv", header=F, sep = ",", format = "%m/%d/%Y")
yrs = 5
niter = nrow(x.r)-yrs*52+1
N = ncol(x.r)
x.r.w = matrix(0,nrow=niter,ncol=N)
for (i in 1:niter) {
     x.r.sub = x.r[i:(i+yrs*52-1),]
     covar = cov.shrink(x.r.sub)
     zeros = array(0, dim = c(N,1))
     aMat  = t(array(1, dim = c(1,N)))
     res = solve.QP(covar, zeros, aMat, bvec=1, meq = 1)
     x.r.w[i,] = res$solution
     }

我已在此链接的Matrix.csv中上传了部分数据

Matrix.csv

1 个答案:

答案 0 :(得分:3)

让我们从你的问题开始。我实际上下载了你的数据,但是你为阅读文件所提供的代码不起作用。它出错了:

Error in read.zoo("Downloads/Matrix.csv", header = FALSE, sep = ";", format = "%m/%d/%Y",  : 
  index has 155 bad entries at data rows: 2 3 6 7 ...

我还将sep=','更改为sep=';',因为这是您提供的数据。接下来,您指定niter,因为x.r为256行,结果为-3。因此,当然x.r.w无法创建nrow=niter,因为zeros = array(0, dim = c(N,1)) aMat = t(array(1, dim = c(1,N))) 没有任何意义......

最后,加快你的代码:

移动for循环之外的常量。具体做法是:

i

因为他们不依赖solve.QP

我确实找到了函数cov.shrink但未找到foreach。我也不熟悉。解算器经常是缓慢而迭代的,很难加速。但是,听起来这可以很容易地分成多个线程。看看for loops

就避免for loop而言,有时代码在apply中比在For loops类型函数中更清晰,更有效。 {{1}}没有被淘汰,只是适当使用。

将来,请创建一个完整的reproducible example,其中包含您的数据,您正在使用的软件包以及有效的代码。这将使您更深入地了解问题,并将为您提供更好,更准确和更完整的答案。