Я хотел бы выполнить по столбцам нормализацию матрицы в R. Учитывая матрицу m
, я хочу нормализовать каждый столбец путем деления каждого элемента на сумму столбца. Один (хакерский) способ сделать это заключается в следующем:
m / t(replicate(nrow(m), colSums(m)))
Есть ли более лаконичный / элегантный / эффективный способ решения той же задачи?
m %*% diag(1/colSums(m))
Другой
prop.table(m, 2)
, или простоpropr(m)
, который используется внутриsweep
.Может быть интересно сравнить производительность этих эквивалентных решений, поэтому я сделал небольшой тест (используя
microbenchmark
пакет).Это входная матрица,
m
которую я использовал:Это настройка бенчмарка:
Вот результаты теста:
Для полноты, это вывод:
Без сомнений победит маленькая матрица !
m / colSums(m)[col(m)]
Но для больших матриц? В следующем примере я использовал матрицу 1000x1000.
Для больших матриц
m / colSums(m)[col(m)]
работает хорошо (4-я позиция), но не выигрывает .Для больших матриц
m %*% diag(1/colSums(m))
выигрывает !источник
propr
?источник