2013-02-10 153 views
3

我有一個顯而易見的問題關於在R中做一個雙循環,無法找到在這個網站上的答案。我使用下面的代碼:R雙循環

mu <- c(0, .2, .5, .8) 
sco <- matrix(nrow = 50, ncol = 4*10) 

for (mu in mus) { 
    for (i in 1:10) { 
    sco[ ,i] <- mu + rnorm(n = 50, mean = 0, sd = 1) 
    } 
} 

現在我得到10列有萬畝+隨機數,但我希望得到的是40列,其中前10列表示畝0 +隨機數,列11到20代表0.2 +隨機數等。

如何修改我的代碼以獲得上述結果?

預先感謝您!

回答

4

是不是所有欄的方差都一樣?爲什麼不用50 * 40的標準正態隨機數創建矩陣,然後在前10列中加0,在後10箇中加0.2,等等。

編輯:

一個例子是這樣的:

result <- matrix(rnorm(50*40,mean=0,sd=1),ncol=40) 
mu <- c(rep(0,10),rep(10,10),rep(20,10),rep(30,10)) 

result <- t(t(result) + mu) 

我忘了如何添加矢量逐列,因此,醜陋的工作與周圍轉2 ...我選擇了不同的值爲mu爲了使結果更清晰。

循環解決方案應該是這樣的(雖然我不會用這個代碼,但你自找的......)

mus <- c(0, 10, 20, 30) 
sco <- matrix(nrow = 50, ncol = 4*10) 

for (mu in 1:4) { 
    for (i in 1:10) { 
    sco[ ,i+(mu-1)*10] <- mus[mu] + rnorm(n = 50, mean = 0, sd = 1) 
    } 
} 
+0

+ 1你能添加一個例子嗎? – 2013-02-10 11:39:46

+0

謝謝,我認爲你的建議現在是一個合適的解決方案。但是,我也想更深入地理解R中的循環函數。因此,對於如何在R中執行此操作的建議值得高度讚賞。 – User33 2013-02-10 11:43:50

+0

我們已經給你如何在R中做到這一點。使用for循環是R很少有必要,通常很慢 – 2013-02-10 11:50:32

2

我會做這樣的事情:

return_numbers = function(mu_value) { 
    matrix(mu_value + rnorm(50 * 10), 50, 10) 
    } 
dat = do.call("cbind", lapply(mu, return_numbers)) 

並完全跳過for循環。通過一次生成前10行的所有數字,然後將矢量調整爲矩陣,我跳過第一個循環。我使用lapply跳過第二個循環來遍歷mu值。最後,我使用cbind將它們放入一個數據結構中。

+0

感謝您的評論。我看到這也會起作用,但我更喜歡使用循環功能。我的代碼的這一部分將會擴展到其他一些循環,所以它不適用於我的目的。 – User33 2013-02-10 11:48:50

+1

如果你要添加更多的循環,我會明確使用'apply'樣式循環和向量化。這導致更快,更短,更容易閱讀代碼imo。 – 2013-02-10 11:51:21

1

rnorm花費的mean參數的載體,其可用於直接計算矩陣值:

逐列:

matrix(rnorm(n=50*10*length(mu), mean=rep(mu, each=50*10)), nrow=50) 

行-wize:

matrix(rnorm(n=50*10*length(mu), mean=rep(mu, each=10)), nrow=50, byrow=TRUE)