从数组中省略 NA 时避免折叠尺寸

Avoid collpasing dimensions when omitting NAs from array

我有一个数组,我必须在其中省略 NA 值。我知道它是一个充满矩阵的数组,其中每一行都有一个 NA 值。我的方法适用于 >2 列的矩阵,但是当只有两列时 apply() 会降低一维(因为在省略 NA 值后,一列消失)。 由于此步骤是更大代码的一部分,因此我想避免对其余部分进行重新编码,并使此步骤对列数为两的情况具有鲁棒性。这是一个简单的例子:

#create an array
arr1 <- array(rnorm(3000),c(500,2,3))

#randomly distribute 1 NA value per row of the array
for(i in 1:500){
arr1[i,,sample(3,1)] <- NA
}

#omit the NAs from the array
arr1.apply <- apply(arr1, c(1,2),na.omit)

#we lose no dimension as every dimension >1
dim(arr1.apply)
[1]   2 500   2


#now repeat with a 500x2x2 array

#create an array
arr2 <- array(rnorm(2000),c(500,2,2))

#randomly distribute 1 NA value per row of the array
for(i in 1:500){
  arr2[i,,sample(2,1)] <- NA
}

#omit the NAs from the array
arr2.apply <- apply(arr2, c(1,2),na.omit)

#we lose one dimension because the last dimension collapses to size 1
dim(arr2.apply)
[1] 500   2

我不希望 apply() 删除最后一个维度,因为它会破坏我的其余代码。

我知道这是 apply() 的一个已知问题,但是,我很想在此步骤中解决该问题,因此我们将不胜感激。到目前为止,我已经尝试使用应该产生的尺寸将 apply() 包装在 array() 命令中,但是,我认为这会以不希望的方式混淆矩阵中的值。

感谢您的帮助。

我提出了一个愚蠢的解决方案,但我认为如果你想保持这种方式,你别无选择:

arr1.apply <- if(dim(arr1)[3] > 2){
apply(arr1, c(1,2),na.omit)} else{
array(apply(arr1, c(1,2),na.omit),dim = c(1,dim(arr1)[1:2]))}