2011-09-16 2 views
9

나는 12 행과 77 열 매트릭스를 가지고 있지만,에 간단하게 사용할 수 있습니다 :행렬에서 행 당 "NA"가 아닌 열을 식별하는 방법은 무엇입니까?

p <- matrix(NA,5,7) 
p[1,2]<-0.3 
p[1,3]<-0.5 
p[2,4]<-0.9 
p[2,7]<-0.4 
p[4,5]<-0.6 

내가 열 "NA"하지 알고 싶어 행당, 그래서 내가 뭔가 것 좀하고 싶습니다 무엇 같은 :

aux <- matrix(NA,5,7) 
for(i in 1:5) { 
    aux[i,]<-which(p[i,]!="NA") 
} 
: 나는 > which(p[]!="NA")을 할 경우

[1] 2,3 
[2] 4 
[3] 0 
[4] 5 
[5] 0 

하지만 난 루프를 사용하여 시도 [1] 6 11 17 24 32

를 얻을 수

하지만 오류가 발생합니다. number of items to replace is not a multiple of replacement length

이 방법이 있습니까? 미리 감사드립니다

답변

16

시도 :

난 그냥 같은 유익하고 사용자가 지정한 출력보다 아마 더 유용하다고 생각하지만 당신이 정말로 목록 버전을 원한다면, 다음이 사용될 수
which(!is.na(p), arr.ind=TRUE) 

:

lapply(apply(p, 1, function(x) which(!is.na(x))) , paste, collapse=", ") 

출력 :

> apply(p, 1, function(x) which(!is.na(x))) 
[[1]] 
[1] 2 3 

[[2]] 
[1] 4 7 

[[3]] 
integer(0) 

[[4]] 
[1] 5 

[[5]] 
integer(0) 

심지어 붙여 넣기와 함께 smushing와 기본이 아닌 TRUE로 설정 arr.ind 매개 변수없이

> which(!is.na(p), arr.ind=TRUE) 
    row col 
[1,] 1 2 
[2,] 1 3 
[3,] 2 4 
[4,] 4 5 
[5,] 2 7 

, 당신은 단지 "벡터 위치"결정 얻을 : which 함수에서 제안 된 방법은 비 제로의 행과 열 (TRUE) 논리적 테스트의 위치를 ​​제공합니다 R이 규칙을 따르는 열의 주요 순서를 사용합니다. R 행렬은 단지 "접힌 벡터"입니다.

> which(!is.na(p)) 
[1] 6 11 17 24 32 
+0

마지막으로 정수 (0) 대신 0을 반환하는 length()> 0 검사가 추가 될 수 있습니다. – joran

+0

lapply, collapse 출력은 clunky 'integer (0)'대신 빈 문자 요소 인'' "'을 생성합니다. –

관련 문제