2015-06-19 70 views
5

所以我有兩個單獨的矩陣(mat1和mat2) ,我需要通過它們才能進行檢查。 我需要將結果存儲到第三個矩陣中。R - 在不使用循環的情況下循環遍歷不同的矩陣!幫助簡單的代碼

我覺得我的代碼很長的目的。

我想提供一些避免循環的建議。

所以我的第一個矩陣看起來像這樣(到底dput)

wit5.001 wit5.002 wit5.003 wit5.004 wit5.005 wit5.006 wit5.007 wit5.008 wit5.009 wit5.010 
[1,]  1  1  1  1  1  1  1   1  1  1 
[2,]  1  1  1  1  1  1  1  1  1  1 
[3,]  1  1  1  1  1  1  1  1  1  1 
[4,]  1  1  1  1  1  1  1  1  1  1 
[5,]  1  1  1  1  1  1  1  0  1  1 
[6,]  1  1  1  1  1  1  1  0  0  0 
[7,]  0  1  1  1  1  1  1  1  1  1 
[8,]  1  1  1  1  1  1  1  1  1  1 
[9,]  1  1  1  1  1  1  1  1  1  1 
[10,]  1  1  1  1  1  1  1  1  1  1 

我的第二個矩陣具有類似的結構。

這裏我創建了我的第三個矩陣 - 爲了存儲檢查的結果。

matCheck <- matrix('ok', ncol = ncol(mat1), nrow = nrow(mat1)) 

這裏是我的循環 - 這是我想避免

for(j in 1:ncol(mat1)){ 
    for(i in 1:nrow(mat1)){ 

    if(mat1[i,j] == 1 & mat2[i,j] == 1) 
    {matCheck[i,j] <- 'ok'} 

    if(mat1[i,j] != 1 & mat2[i,j] == 1) 
    {matCheck[i,j] <- '!'} 

     } 
    } 

檢查

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[2,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[3,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[4,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[5,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[6,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "!" "!" "ok" 
[7,] "!" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[8,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[9,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 
[10,] "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" "ok" 

任何建議的結果?

這裏是矩陣1

mat1 = structure(c(1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1), .Dim = c(10L, 
10L), .Dimnames = list(NULL, c("wit5.001", "wit5.002", "wit5.003", 
"wit5.004", "wit5.005", "wit5.006", "wit5.007", "wit5.008", "wit5.009", 
"wit5.010"))) 

這裏是矩陣2

mat2 = structure(c(1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 
1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 
1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 
0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), .Dim = c(10L, 
10L), .Dimnames = list(NULL, c("wit5.020", "wit5.021", "wit5.022", 
"wit5.023", "wit5.024", "wit5.025", "wit5.026", "wit5.027", "wit5.028", 
"wit5.029"))) 
+0

@Frank - 對不起,我的錯 - 你是對的,他們不是不同的維度(我在我的子集中犯了一個錯誤)。我更正了代碼。 – giacomo

+0

我會試試你們的主張,謝謝 – giacomo

+0

是不是很簡單!哦,不......在所有的努力後把我的循環;)謝謝@弗蘭克 - 把它作爲一個答案 – giacomo

回答

4

對於示例給出的,可以構造該結果作爲

matCheck <- (mat1 | !mat2) 

這等同於初始化matCheck爲真,然後填寫虛假!mat1 & mat2(如在OP的循環)。括號是可選的,但更容易閱讀(我認爲)。