我有一个数组,我必须省略NA值。我知道它是一个充满矩阵的数组,每行只有一个NA值。我的方法适用于> 2列矩阵,但apply()
在只有两列时会丢弃一个维度(因为省略NA值后,一列消失)。
由于此步骤是更大代码的一部分,因此我希望避免重新编码其余部分,并使此步骤在列数为2时保持稳健。这是一个简单的例子:
#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()
,但是,我认为这会以不可取的方式混合矩阵中的值。
感谢您的帮助。
答案 0 :(得分:1)
我提出了一个愚蠢的解决方案,但我认为如果你想保持这种方式你别无选择:
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]))}