从数组中省略 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]))}
我有一个数组,我必须在其中省略 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]))}