Применить функцию с условным оператором на многомерном массиве - PullRequest
0 голосов
/ 25 мая 2018

У меня есть два 3D-массива:

a=array(1:27, dim=c(3,3,3))
b=array(c(0,2,6,0), dim=c(3,3,3))

Я хотел бы суммировать все значения в массиве a вдоль z-измерения (получая 2D-матрицу), для которых значение в соответствующемx, y, z-местоположение в массиве b -> 0.

Я бы предпочел комбинацию apply (лучше всего со стандартной функцией) и оператора if, например

summed=apply(a, c(1,2), sum {if(b[b>0])})

что дает мне синтаксическую ошибку, хотя.Что мне здесь не хватает?

1 Ответ

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

Мы могли бы умножить «a» на логический массив «b».Умножив «a» на двоичный массив «b», те элементы, которые равны 0 в «b», станут 0 в «a», а 1 * число остается числом

a* (b > 0) 

Затем мы транспонируем массивс aperm и получите colSums

colSums(aperm(a * (b > 0), c(3, 1, 2)))
#      [,1] [,2] [,3]
#[1,]   10   26   16
#[2,]   22   14   34
#[3,]   12   30   18
...