2017-11-29 25 views
0

저는 프로그램 r에서 작업 중이며 일부 코드를 작성하는 데 도움이 필요합니다. 저는 50 by 3 by 8 차원 배열을 가지고 있습니다. 이 배열의 대부분의 셀은 0이지만 일부는 NA입니다. 배열의 0을 일련의 숫자로 대체하여 행의 모든 ​​셀이 같은 번호를 가져야합니다. 시퀀스는 1에서 시작하여 배열의 총 행 수까지 실행됩니다. 또한 NAs가 남아 있어야하므로 NAs가있는 셀을 덮어 쓸 수 없습니다. 또한 일부 행은 모두 NA이므로 행 순서는 정확히 400 (50 x 8)이 아니지만 그보다 작습니다. 나는이 문제의 각 부분을 다루는 방법에 대한 정보를 찾았지만, 모든 부분을 작동하는 방식으로 모으기 위해 고심하고있다. 이 r 코드를 작성하는 데 큰 도움을 주셔서 감사합니다. 예
이 배열 :
Y < -array (0 희미한 = C를 (10,3,2))
#add의 NA
Y [4,2 : 3,1] < · NA
y [8,1 : 3,1] < -NA
y [10,1 : 3,2] < -NA
배열의 첫 번째 행에 행이있는 순서로 0을 대체해야합니다. 1에서 9까지 번호가 매겨집니다. (행 1의 모든 셀은 1, 2는 2와 같이, NAs는 그대로 남아 있습니다.) 행렬 2는 열 번호가 10에서 18까지입니다.일련 번호가있는 행을 배열에 채우기

+2


주소 편집은, 두 가지 이상의 방법에 의문을 제기합니다. 예를 들어, 4x3 값과 같은 간단한 2 차원 배열에서도 문제를 설명 할 수 있다고 가정합니다. 또한 "문제의 각 부분을 처리하는 방법에 대한 정보"와 관련하여보다 구체적으로 설명하십시오.이 링크를 사용하여 문제를 해결할 수 있습니다. – maschu

답변

0

내가 알 수있는 한, 이것은 (그림의 작은 크기로) 원하는 것입니다.

## Set up example data 
## (you should provide something like this in your question!!) 
set.seed(47) 
d = c(5, 2, 3) 
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d) 
# set a row to all na: 
x[2, , ] = NA 

우리는 먼저 NA하지 않는 행을 찾고, 교체 순서를 계산합니다. 그런 다음 간단한 for 루프로 대체합니다.

r = ! apply(is.na(x), MARGIN = 1, all) 
rows = which(r) 
rn = seq_along(r[r]) 

for (i in seq_along(rows)) { 
    x[rows[i], , ][x[rows[i], , ] == 0] = rn[i] 
} 

x 
# , , 1 
# 
#  [,1] [,2] 
# [1,] NA NA 
# [2,] NA NA 
# [3,] NA 2 
# [4,] NA NA 
# [5,] NA NA 
# 
# , , 2 
# 
#  [,1] [,2] 
# [1,] 1 NA 
# [2,] NA NA 
# [3,] 2 2 
# [4,] NA 3 
# [5,] NA 4 
# 
# , , 3 
# 
#  [,1] [,2] 
# [1,] 1 1 
# [2,] NA NA 
# [3,] NA 2 
# [4,] 3 NA 
# [5,] NA NA 

원하는 결과가 아니라면 샘플 입력과 해당 출력을 제공하여 질문을 명확히하십시오. 못생긴 이해 방식과 완전히 너무 영리한 방법 : 그것은 정확히 당신이 목표로하고있는 무슨의 작은 예를 제공하기 위해 도움이 될

# sample data 
set.seed(47) 
d = c(5, 2, 3) 
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d) 

# nested for loopsr 
r = !apply(is.na(x), c(1, 3), all) 
counter = 0 
for (k in 1:dim(x)[3]) { 
    for (i in 1:dim(x)[1]) { 
     if(r[i, k]) { 
      counter = counter + 1 
      x[i, , k] = x[i, , k] + counter 
     } 
    } 
} 
x 

# now the clever way 
# reset the data 
set.seed(47) 
x = array(sample(c(0, NA), size = prod(d), replace = T), dim = d) 

xm = matrix(aperm(x, c(1, 3, 2)), ncol = 2) 
axm = ! apply(is.na(xm), 1, all) 
xm = xm + cumsum(axm) 
aperm(array(c(xm), dim = d[c(1, 3, 2)]), c(1, 3, 2)) 
# , , 1 
# 
#  [,1] [,2] 
# [1,] NA NA 
# [2,] 1 1 
# [3,] NA 2 
# [4,] NA NA 
# [5,] NA NA 
# 
# , , 2 
# 
#  [,1] [,2] 
# [1,] 3 NA 
# [2,] NA 4 
# [3,] 5 5 
# [4,] NA 6 
# [5,] NA 7 
# 
# , , 3 
# 
#  [,1] [,2] 
# [1,] 8 8 
# [2,] NA 9 
# [3,] NA 10 
# [4,] 11 NA 
# [5,] NA NA 
+0

입력 해 주셔서 감사합니다. 이것은 제가 찾고있는 거의 것입니다. 그러나 숫자 시퀀스는 배열의 행렬에 걸쳐 계속되어야하며 각 행렬에 대해 새로 시작하지 않아야합니다. 예제에서 행렬 1은 시퀀스의 행 1을 가지며 행렬 2는 2에서 5까지 번호가 매겨진 행을 가지며 행렬 3 행은 6에서 8까지 번호가 매겨집니다. – Lat68

+0

배열의 첫 번째 행에있는 셀이 "1"이 아니라 "2"입니까? 왜 이것이 "2"를 얻게되는지 확실하지 않습니다. 귀하의 의견을 보내 주셔서 감사합니다. – Lat68

+0

첫 번째 행'a [1,,] '의 0은 1을 얻고, [a [2,]]는 모두 빠져 있으므로 거기에 아무 것도 없기 때문에 2를 준다. 따라서 a [3, 2 (원래 내가 문제를 어떻게 해석했는지)를 얻으십시오. – Gregor