删除3D阵列中的NA并重塑形状

时间:2019-06-20 10:11:01

标签: arrays r na

我有一个数组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 个答案:

答案 0 :(得分:1)

na.omitapply一起使用,并与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)