2013-01-14 18 views
0

一個矢量I需要重複這樣的10次的過程如下:使用應用或一個循環來輸出具有預定長度

> random=rnorm(5) 
> total=sum(random) 

,然後把總每次到稱爲最終載體。

爲一個循環,我想我會寫:

> final <- c(total[[i]]) 
> for(i in 1:10){ 
    random=rnorm(5) 
    total=sum(random) 
    ... 
} 

...不知道如何把我的總數爲我的最終載體? 也從網上查找大多數地方說我應該使用應用代碼。我應該使用哪一個?我怎樣才能將總數計入最終?

回答

2

[R提供的正是這種使用情況稱爲replicate功能,它會重複操作多次指定,並存儲在一個向量的結果:

> replicate(10, sum(rnorm(5))) 
[1] -0.2286870 1.5123902 -5.8179539 1.2119908 -2.8749987 5.5817021 
[7] 2.5427969 2.1833426 0.4884455 -3.6787912 

如果生產函數數據更復雜的,那麼你可以使用複製來調用一個函數,或直接使用sapply。所以

> genRandomData <- function() { 
    random <- rnorm(100) 
    c(sum(random), var(random)) 
} 
> replicate(10, genRandomData()) 
     [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] 
[1,] 6.612235 6.895032 -4.004501 -8.250871 2.3098680 2.0388161 23.5202949 
[2,] 1.082576 0.769107 1.119480 1.206932 0.9930102 0.9078762 0.9544335 
      [,8]  [,9]  [,10] 
[1,] -12.2080648 9.0074524 0.2358715 
[2,] 0.8256081 0.8669045 0.9017415 

,或者以使用sapply相同的輸出(這是很好的,因爲它不替代回覆),

> sapply(integer(10), function(x) { 
    random <- rnorm(100) 
    c(sum(random),var(random)) 
}) 

如果你想獲得一個數據幀從年底這個,你必須轉置;所以

> data.frame(t(sapply(integer(10), function(x) { 
    random <- rnorm(100) 
    list(s=sum(random),v=var(random)) 
}))) 
      s   v 
1 -6.343845 1.0397 
2 12.94773 0.9480807 
3 5.811322 0.9670198 
4 -1.941444 1.04547 
5 -0.9094589 0.862759 
6 -2.852641 0.5504582 
7 -8.471266 1.080554 
8 -17.2341 1.201679 
9 11.60805 1.150254 
10 -7.138314 1.080731 
+0

謝謝,我大概簡化了這個問題太多。我試圖重複的過程有八個獨立的功能以及其他東西的加載,在R中佔用了超過20行,我能夠在整個事情上使用複製嗎? –

+0

把所有的代碼放在一個函數中(比如'dostuff')然後執行'replicate(10,dostuff())' –

+0

最簡單的事情就是將行爲封裝到一個函數中,然後使用複製運行多次。我會更新我的答案。 – user295691

相關問題