저는 프로그램 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까지입니다.일련 번호가있는 행을 배열에 채우기
답변
내가 알 수있는 한, 이것은 (그림의 작은 크기로) 원하는 것입니다.
## 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
입력 해 주셔서 감사합니다. 이것은 제가 찾고있는 거의 것입니다. 그러나 숫자 시퀀스는 배열의 행렬에 걸쳐 계속되어야하며 각 행렬에 대해 새로 시작하지 않아야합니다. 예제에서 행렬 1은 시퀀스의 행 1을 가지며 행렬 2는 2에서 5까지 번호가 매겨진 행을 가지며 행렬 3 행은 6에서 8까지 번호가 매겨집니다. – Lat68
배열의 첫 번째 행에있는 셀이 "1"이 아니라 "2"입니까? 왜 이것이 "2"를 얻게되는지 확실하지 않습니다. 귀하의 의견을 보내 주셔서 감사합니다. – Lat68
첫 번째 행'a [1,,] '의 0은 1을 얻고, [a [2,]]는 모두 빠져 있으므로 거기에 아무 것도 없기 때문에 2를 준다. 따라서 a [3, 2 (원래 내가 문제를 어떻게 해석했는지)를 얻으십시오. – Gregor
주소 편집은, 두 가지 이상의 방법에 의문을 제기합니다. 예를 들어, 4x3 값과 같은 간단한 2 차원 배열에서도 문제를 설명 할 수 있다고 가정합니다. 또한 "문제의 각 부분을 처리하는 방법에 대한 정보"와 관련하여보다 구체적으로 설명하십시오.이 링크를 사용하여 문제를 해결할 수 있습니다. – maschu