2015-06-20 40 views
0

這個問題很難解釋,但我相信你們中的一些人已經面對過這個問題。R - 檢查有可能滯後的不同矩陣

所以我有兩個矩陣。 矩陣1(墊1)和 黑客帝國2(墊2

我想要做的是在第三矩陣記錄(MAT3MAT2的價值,檢查後矩陣1,但帶有LAG。讓我解釋。

在基質1中的值後,我想檢查矩陣2作爲太多,但一定的滯後範圍內,例如,1或2次發作後(列)。

例如,行號4在第6列的矩陣1中具有。 所以我想檢查矩陣2中的第4行是否有一個直接在2或3列之後或之後。

你明白這個主意嗎?

mat1 = structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 
0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 
1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 
0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), .Dim = c(10L, 21L), .Dimnames = list(NULL, c("wit5.020", 
"wit5.021", "wit5.022", "wit5.023", "wit5.024", "wit5.025", "wit5.026", 
"wit5.027", "wit5.028", "wit5.029", "wit5.030", "wit5.031", "wit5.032", 
"wit5.033", "wit5.034", "wit5.035", "wit5.036", "wit5.037", "wit5.038", 
"wit5.039", "wit5.040"))) 

mat2 = structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 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, 1, 0, 0, 
0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 
1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 
0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 
1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 
0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 
0, 1, 0, 1), .Dim = c(10L, 21L)) 

所以MAT3 - 在這裏我想存儲檢查

mat3 = matrix(0, nrow = nrow(mat1), ncol = ncol(mat1)) 

所以這裏的結果是爲了檢查LAG可能環 的例子 - 這循環不工作,但它可以給你一個想法的解決方案。 我不確定在哪裏介紹滯後。我想也許在,但我不知道。

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

    if(mat1[i,j] == 1 & mat2[i,j] == 1 | mat2[i+1,j] == 1 | mat2[i+2,j] == 1) # lag here 
    {mat[i,j] <- 1} 

else 
{mat[i,j] <- 0} 

    } 
} 

任何想法都非常受歡迎。

+1

什麼是'mat1.wake'和'mat'? t應分別爲mat1和mat3。另外,如果根據你的描述你想落在列('j')上,你爲什麼會滯後於行('i')?如果你只是遵循你自己的解釋,我相信你可以使這個循環工作。 –

+0

@DavidArenburg對不起* mat1.wake *是* mat1 *!我的錯 – giacomo

+0

無論哪種方式,你可以嘗試vectorise如下,但我不喜歡這種方法太多'indx < - mat1 == 1L; mat3 [indx] < - (mat2 [indx] == 1L)|(cbind(mat2 [, - (1L:2L)], FALSE,FALSE)[indx] == 1L)' –

回答

1

這裏有一個簡單的方法來做到這一點:

lag <- 3 # or whatever lag you want 
nr <- nrow(mat1) 
nc <- ncol(mat1) 

mat3 <- matrix(0, ncol=nc, nrow=nr) 
for (r in 1:nr) { 
    for (c in 1:nc) { 
    if (mat1[r,c] == 1 && any(mat2[r,c:min(c+lag,nc)] == 1)) 
     mat3[r,c] <- 1 
    } 
} 

注意使用mat2[r,c:min(c+lag,nc)]。這將選擇當前列c中的所有元素直到列c + lag,但它確保不會超過nc(列的總數)。也就是說,該代碼用於避免出現界限錯誤。

這樣做可能有更快,更具矢量性的方式,但上面的代碼應該可以工作。

+0

非常感謝您的循環。這太好了。我意識到我需要的是在矩陣3中存儲'mat3 [r,c]'不** 1 **在'[r,c]'處,但實際上到處都是。你明白我的意思嗎?就像每次都有一個** 1 **,在mat1的某個滯後之後(因爲你的循環正確) - 然後在*之前實際上將** 1 **放在每列中*。你能幫我做到嗎?謝謝 – giacomo