R, матрицы: вычесть максимум построчно, удалив NA - PullRequest
0 голосов
/ 24 марта 2020

Учитывая неквадратную матрицу a Мне нужно вычесть из каждой строки свой максимум. Матрица содержит NA s, которые должны быть отброшены. Размеры матрицы известны заранее и фиксированы. Кроме того, все NA находятся под главной диагональю, если эта информация помогает, то есть a имеет форму

a11 a12 a13 a14 ...
NA  a22 a23 a24 ...
NA  NA  a33 a34 ...
...

На данный момент я использую

a <- a - apply(a,1,function(x){max(x, na.rm=TRUE)})

(что, кстати, быстрее, чем t(apply(a,1,function(x){x-max(x, na.rm=TRUE)}))).

Интересно, есть ли более быстрое решение, потому что эту операцию придется повторять очень много раз.

В Stackoverflow я нашел ответы на похожие вопросы, предлагая использовать pmax, но для этого потребовалось бы преобразовать матрицу в список, и это, я думаю, сделало бы ее намного медленнее, чем мое решение. В некоторых ответах предлагалось использовать rowwise из dplyr, но для этого требуется сначала преобразовать матрицу в фрейм данных.

Спасибо за ваши предложения!

1 Ответ

1 голос
/ 24 марта 2020

Мы можем попробовать использовать rowMaxs из matrixStats пакета, который обычно быстрее

a - matrixStats::rowMaxs(a, na.rm = TRUE)
...