Удалить NA в массиве 3D и изменить форму - PullRequest
1 голос
/ 20 июня 2019

У меня есть массив num [1:800, 1:533, 1:3]. По сути это изображение с 800 столбцами, 533 строками и 3 каналами. В каждом ряду каждого канала есть ровно один NA.

Как я могу удалить все NA во всех трех каналах и изменить форму массива так, чтобы он был на один столбец меньше и, следовательно, массив с размерами num [1:799, 1:533, 1:3]?

Я пытался na.omit(), но это не сработало.

Пример:

testarray<- array(c(1:27), c(3,3,3))
testarray[1,1,] = NA
testarray[2,2,] = NA
testarray[3,1,] = NA

> testarray
, , 1

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

, , 2

     [,1] [,2] [,3]
[1,]   NA   13   16
[2,]   11   NA   17
[3,]   NA   15   18

, , 3

     [,1] [,2] [,3]
[1,]   NA   22   25
[2,]   20   NA   26
[3,]   NA   24   27

В этом массиве ровно один NA для каждой строки и каждого канала. Я хочу удалить NA и изменить форму массива, чтобы получить следующий вывод:

, , 1
     [,1] [,2] 
[1,]    4    7
[2,]    2    8
[3,]    6    9

, , 2

     [,1] [,2] 
[1,]   13   16
[2,]   11   17
[3,]   15   18

, , 3

     [,1] [,2] 
[1,]   22   25
[2,]   20   26
[3,]   24   27

1 Ответ

1 голос
/ 20 июня 2019

Используйте na.omit с apply и транспонируйте с aperm.

Пример

Рассмотрите массив A.

A
# , , 1
# 
# [,1] [,2] [,3]
# [1,]    1    3   NA
# [2,]   NA    4    6
# 
# , , 2
# 
# [,1] [,2] [,3]
# [1,]    1    3   NA
# [2,]   NA    4    6
# 
# , , 3
# 
# [,1] [,2] [,3]
# [1,]    1   NA    5
# [2,]   NA    4    6
# 
# , , 4
# 
# [,1] [,2] [,3]
# [1,]    1   NA    5
# [2,]    2   NA    6

Метод

aperm(apply(A, c(1, 3), na.omit), c(2, 1, 3))
# , , 1
# 
# [,1] [,2]
# [1,]    1    3
# [2,]    4    6
# 
# , , 2
# 
# [,1] [,2]
# [1,]    1    3
# [2,]    4    6
# 
# , , 3
# 
# [,1] [,2]
# [1,]    1    5
# [2,]    4    6
# 
# , , 4
# 
# [,1] [,2]
# [1,]    1    5
# [2,]    2    6

Данные

A <- structure(c(1L, NA, 3L, 4L, NA, 6L, 1L, NA, 3L, 4L, NA, 6L, 1L, 
NA, NA, 4L, 5L, 6L, 1L, 2L, NA, NA, 5L, 6L), .Dim = 2:4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...