2011-01-28 2 views
5

주어진 셀이 NA이고 적어도 존재한다면 인덱스가 참인 매트릭스에서 NA 값의 위치를 ​​나타내는 인덱스를 얻고 싶습니다 그 전후의 하나의 비 NA 값. 예를 들어, 다음의 행렬매트릭스 컬럼의 "가운데"에서만 NA를위한 위치를 얻으십시오

 [,1] [,2] [,3] [,4] 
[1,] NA 1 NA 1 
[2,] 1 NA NA 2 
[3,] NA 2 NA 3 

에게 있어야 되돌아 온다 TRUE 인덱스 값만 주어 [2,2].

내가 원하는 작업을위한 간단한 표현이 있습니까? 필자는 열을 반복하고 min(which(!is.na(x[,i])))과 같은 것을 사용하여 각 열의 첫 번째 비 NA 값을 찾은 다음 모든 값을 FALSE로 설정하고 최대 값 이후의 모든 값을 동일하게 설정해야합니다. 이렇게하면 앞과 뒤의 NA 값을 선택하지 않습니다. 그러나 이것은 약간 지저분 해 보입니다. 따라서 루프없이이 작업을 수행하는 명확한 표현식이 있는지 궁금합니다.

EDIT 유효하려면 NA 값은 열 안의 어딘가에 있으면서 그 값의 앞뒤에 비 어플라이언스 값이 있어야하지만 인접하지 않아도됩니다. 예를 들어, 열이 c (NA, 3, NA, NA, NA, 4, NA)로 정의 된 경우 3, 4 및 5 위치에있는 NA를 찾을 수 있습니다. 비 NA 값.

+0

[2,3]도 반환하지 않아야합니까? – daroczig

+0

daroczig - 아니요, 그 전후에 비 NA 값이 없기 때문입니다. – Abiel

+0

감사합니다. 더 신중하게 질문을 읽어야합니다. 나는 당신의 세부 사항을 기반으로 한 벡터화 된 대답을 만들려고 노력했다. – daroczig

답변

4

은 매우 철저하게이 테스트하지 않은,하지만 테스트 케이스에 대한 작업을 수행합니다

z <- matrix(c(NA,1,NA,1,NA,2,NA,NA,NA,1,2,3),ncol=4) 
isNA <- is.na(z) 
# Vertical index which increments at non-NA entries, counting top-to-bottom: 
nonNA_idx.tb <- apply(!isNA, 2, cumsum) 
# Vertical index which increments at non-NA entries, counting bottom-to-top: 
nonNA_idx.bt <- apply(!isNA, 2, function(x) { rev(cumsum(rev(x))) }) 
which(isNA & nonNA_idx.tb>0 & nonNA_idx.bt>0, arr.ind=TRUE) 

(PS - 나는 꽤 귀여운 것 같아요,하지만 난 편견 해요)

+0

감사합니다 벤, 내 초기 테스트는이 작업을 보여줍니다. – Abiel

+0

당신은 영리함을 설명해야합니다. x1은 NA가 아닌 항목에서 증가하는 인덱싱 시퀀스이며 맨 위에서 아래로 계산됩니다. x2는 앞뒤가 같은 (bottom-to-top) 것으로 계산됩니다. 그것들은 상단과 하단 모두에서 non-NAs로 둘러싸인 내부 엔트리에서 모두 0이 아니므로 양방향으로 계산하는 비 NA 인덱스는> 0입니다. 마지막으로 &를 사용하여 내부 NAs를 필터링합니다. x1, x2의 이름을 더 직관적으로 바꿀 수 있습니까? nonNA_idx.tb, 아마도 nonNA_idx.bt입니까? – smci

+0

@smci, 필요한 평판이 있다면 (그리고 2K처럼 보이지만) 편집 해주십시오. –

1
m <- matrix(c(NA, 1, NA, 1, NA, 2, NA, NA, NA, 1, 2, 3), ncol= 4) 

matmain <- is.na(m) 
matprev <- rbind(FALSE, head(!matmain, -1)) 
matnext <- rbind(tail(!matmain, -1), FALSE) 

which(matmain & (matprev | matnext), arr.ind = TRUE) 

나는이 질문을 약간 다르게 해석했다. 칼럼에서 앞뒤로 말할 때, 직전과 직후, 또는 전후 어디에서든지를 의미합니까? 다음과 같은 테스트 매트릭스를 사용하면 [2,1] [3,1]과 [2,2]가되지만 [2,3]는 무엇입니까?

m <- matrix(c(1, NA, NA, 5, 1, NA, 3, 5, 4, NA, NA, NA, 1, 2, 3, 5), ncol= 4) 
+0

당신의 대답과 내 것은 보완 적이라고 생각합니다. (질문의 다른 해석) –

+0

실제로 더 가까운 독서에, 나는 그것을 잘못 생각했습니다. [2, 2]보다. 마지막 줄의'| '를'&'로 변경하면 [2, 2] 만 반환됩니다.하지만 그는 누적 누적 개수를 찾고 있다고 생각합니다. 그러나 전에는 결코 for 루프를 사용하지 않고 근처의 행과 열을 참조하는 방법을 알지 못했기 때문에 유용한 질문입니다. –

+0

혼란스럽게 죄송 합니다만, 그 전후에 비 NA 값이있는 NA를 의미 했었습니다. 예를 들어, 행렬 (c (NA, 1, NA, NA, 1, NA, NA, 2, NA, NA, NA, NA, 1,2,3,4), ncol = 4) 당신은 단지 [2,2]와 [2,3]를 반환하기를 원할 것입니다. 그럼에도 불구하고 코드는 인접한 비 NA 값이 있어야하는 NA를 다루는 관련 문제에 대해 흥미로운 접근 방식을 제공합니다. – Abiel

0

PTS < - 샘플 : -있는 (매트릭스 (PTS,을 NcoI = 10)

매트 < (c (110, NA), 사이즈 = 100, = T 교환) is.na (mat), arr.ind = T)

관련 문제