假設我有以下代碼:交叉for循環:挑選第i個第一環路然後循環的元件完全通過第二環路
:X <- model.matrix(~factor(1:2))
beta <- c(1, 2)
我然後從兩個多變量正態分佈繪製70倍40的值
library(MASS)
S1 <- mvrnorm(70, mu = c(0,0), Sigma = matrix(c(10, 3, 3, 2), ncol = 2))
S2 <- mvrnorm(40, mu = c(0,0), Sigma = matrix(c(10, 4, 4, 2), ncol = 2))
可以很容易看到S1
是70x2
矩陣和S2
a 40x2
矩陣。
現在我在R
建立一個for循環:
z <- list()
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta + X %*% S1[1,] + X %*% S2[i,] + rnorm(2, mean = 0, sd = 0.45)
Y <- do.call(rbind, z)
}
這給了我一個包含在S2
的40
元素與S1
的1
第一單元的所有組合的矩陣。我想是完全跨兩個矩陣S1
和S2
。這是我想要的for循環挑出S1[1,]
第一,然後通過S2[i,]
(例如,在內部循環)完全迭代,並存儲在一個矩陣中的結果然後通過S2[i,]
再次挑出S1[2,]
迭代並且將結果存儲在一個矩陣等。如果我需要給我一個名字,我要找的是"crossed for loops"
。我發現它拿出R
-code,讓我做到這一點非常努力。任何提示將不勝感激。
也許這個想法會得到這個例子更清楚:
我的想法是相當於建設70個for
-loops在S1[i,]
每一個元素,並在70*40*2x1
矩陣結果綁定:
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[1,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y1 <- unname(do.call(rbind, z))
}
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[2,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y2 <- unname(do.call(rbind, z))
}
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[3,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y3 <- unname(do.call(rbind, z))
}
.
.
.
for(i in 1:dim(S2)[1]){
z[[i]] <- X %*% beta+X %*% S1[70,]+X %*% S2[i,]+rnorm(2, mean = 0 , sd = sigma)
Y70 <- unname(do.call(rbind, z))
}
Y <- rbind(Y1, Y2, Y3, …, Y70)
我非常想與for
-loops或可處理不同尺寸和S1
任何S2
等靈活的方式來做到這一點。
你舉的例子不是[完成或重現性(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible例如),所以很難準確回答。看起來你可能可以在這裏使用'outer',但是你不知道你期望的結果是什麼(因爲你的代碼不是可運行的)。 – MrFlick
對不起。這個例子現在應該是可重現的。 –
是的,我以爲我在文中提到過這個問題:「將結果存儲在矩陣中」。但我可能一直不清楚。理想情況下,輸出將是一個矩陣。我想通過'S2 [j,]'遍歷每個'S1 [i,],i = 1,...,70'的矩陣形成一個大矩陣。 –