2013-01-09 40 views
-3

如果可能,我試圖避免使用for循環。這是整個代碼,矩陣的數據只是百分比。如何避免在代碼中運行代碼幾行代碼時使用for循環R

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

+2

請參閱[本文](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。你能發表一部分數據和你使用的變量嗎?即'x.r','niter','yrs','N'和'x.r.w'。另外,你不需要'next'它隱含在'for循環'中。 – Justin

+0

@Justin謝謝你的回覆。這是時間序列數據,我在一個更大的陣列中爲每個52個觀察子集運行代碼。我只是新來的R,不知道我想要什麼是可能的。 – nopeva

+1

R.在R中一切皆有可能。您提供的關於數據和問題的信息越多,答案就越好。 – Justin

回答

3

上傳在Matrix.csv數據的部分使你的問題開始。我實際上下載了你的數據,但是你讀取文件的代碼不起作用。與它的錯誤:

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創建並不意味着什麼......

最後,加快你的代碼:

移動的東西,是你的for循環的不斷外。具體來說:

zeros = array(0, dim = c(N,1)) 
aMat = t(array(1, dim = c(1,N))) 

因爲它們不依賴於i

我確實找到了功能solve.QP,但沒有找到cov.shrink。而且我也不熟悉。解算器經常是緩慢迭代的,難以加速。但是,這聽起來像是可以輕鬆分成多個線程的東西。看看foreach

就避免for loops而言,有時代碼在for loop中與在apply類型函數中的代碼相比更加清晰和高效。 For loops沒有被淘汰,只是使用得當。

未來,請創建一個完整的reproducible example,其中包含您的數據,您正在使用的軟件包以及可用的代碼。這將引導您更深入地瞭解問題,併爲您提供更好,更準確,更完整的答案。

+0

包含cov.shrink的包是corpcor。無論如何感謝您的回覆。你得到的錯誤可能與我的Windows配置區域有關,因爲我不知道爲什麼R有時會識別sep =「;」 as sep =「,」在我的電腦中。 – nopeva