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