Избегайте слияния размеров при исключении NA из массива - PullRequest
0 голосов
/ 08 мая 2018

У меня есть массив, где я должен опустить значения 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(), используя размеры, которые должны получиться, однако я думаю, что это смешивает значения в матрице таким образом, что нежелательно.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 мая 2018

Я предлагаю глупое решение, но я думаю, что у вас нет выбора, если вы хотите оставить его таким:

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]))}
...