2017-11-25 19 views
0

정말 이해하기 쉬운 것이지만 아직 R 기술을 해결할 수는 없습니다.array [,, i] 차원의 NAs를 찾고 행렬에서 해당 위치를 NA로 표시하십시오.

의 내가 가지고 다음과 같은 배열을 가정 해 봅시다 :

mat1 = as.matrix(data.frame(col1 = c(1,2,3,4,5,6,7,8), col2 = c(2,3,'NA',5,6,7,8,9), col3 = c(3,4,5,6,7,8,9,10), col4 = c(2,3,4,1,2,6,7,8), 
          col5 = c(2,3,'NA','NA',6,7,8,9), col6 = c(1,2,3,5,6,7,8,9), col7 = c(1,2,3,4,6,7,'NA','NA'), col8 = c(1,2,3,4,5,6,'NA','NA'))) 


mat2 = as.matrix(data.frame(col1 = c('NA',2,3,4,5,6,7,8), col2 = c(2,3,1,5,6,7,8,9), col3 = c(3,4,5,6,7,8,9,'NA'), col4 = c(2,3,4,1,2,6,7,8), 
       col5 = c(2,3,11,88,6,7,8,9), col6 = c(1,2,3,5,6,7,8,9), col7 = c(1,2,3,4,6,7,'NA','NA'), col8 = c(1,2,3,4,5,6,'NA','NA'))) 

#ignore warnings 
class(mat1) = 'numeric' 
class(mat2) = 'numeric' 

my_array = array(c(mat1, mat2), dim = c(8,8,2)) 
print(my_array) 
, , 1 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 2 3 2 2 1 1 1 
[2,] 2 3 4 3 3 2 2 2 
[3,] 3 NA 5 4 NA 3 3 3 
[4,] 4 5 6 1 NA 5 4 4 
[5,] 5 6 7 2 6 6 6 5 
[6,] 6 7 8 6 7 7 7 6 
[7,] 7 8 9 7 8 8 NA NA 
[8,] 8 9 10 8 9 9 NA NA 

, , 2 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] NA 2 3 2 2 1 1 1 
[2,] 2 3 4 3 3 2 2 2 
[3,] 3 1 5 4 11 3 3 3 
[4,] 4 5 6 1 88 5 4 4 
[5,] 5 6 7 2 6 6 6 5 
[6,] 6 7 8 6 7 7 7 6 
[7,] 7 8 9 7 8 8 NA NA 
[8,] 8 9 NA 8 9 9 NA NA 

그리고 다음의 행렬 : mat3에서

mat3 = matrix(seq(1,64,1), nrow = 8, ncol = 8) 
print(mat3) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 9 17 25 33 41 49 57 
[2,] 2 10 18 26 34 42 50 58 
[3,] 3 11 19 27 35 43 51 59 
[4,] 4 12 20 28 36 44 52 60 
[5,] 5 13 21 29 37 45 53 61 
[6,] 6 14 22 30 38 46 54 62 
[7,] 7 15 23 31 39 47 55 63 
[8,] 8 16 24 32 40 48 56 64 

을, 나는 NA에 모두 my_array[,,i] 차원에서 NA를있는 관찰을 변환해야 , 여기서 i = 1,2.

내 예상 출력은 다음과 같습니다

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 9 17 25 33 41 49 57 
[2,] 2 10 18 26 34 42 50 58 
[3,] 3 11 19 27 35 43 51 59 
[4,] 4 12 20 28 36 44 52 60 
[5,] 5 13 21 29 37 45 53 61 
[6,] 6 14 22 30 38 46 54 62 
[7,] 7 15 23 31 39 47 NA NA 
[8,] 8 16 24 32 40 48 NA NA 

내 실제 배열 i = 1:1000을 가지고있다.

의견이 있으십니까? 감사

답변

1

사용이 :

mat3[which(is.na(mat1)*is.na(mat2)==1,arr.ind = TRUE,useNames = FALSE)]=NA 

또는이 하나

mat3[which(is.na(my_array[,,2])*is.na(my_array[,,1])==1,arr.ind = TRUE,useNames = FALSE)]=NA 

1 1000 크기 :

내 진짜 배열이 난을 가지고있다
mat3[which(apply(is.na(my_array),FUN = prod,MARGIN = 1:2)==1,arr.ind = TRUE,useNames = FALSE)]=NA 
+0

= 1 : 1000. 나는 당신의 솔루션 – aaaaa

+1

을 적용 할 수 없으므로이 코드를 사용할 수있다 :'mat3 [which (apply.is.na (my_array), FUN = prod, MARGIN = 1 : 1000) == 1, arr.ind = TRUE, useNames = FALSE)] = NA' –

+0

안녕하세요, i = 1 : 1000에서는 작동하지 않습니다. 나는 다음과 같은 오류가 발생했다 : if (d2 == 0L) {: 누락 된 값이 TRUE/FALSE가 필요하다. – aaaaa