Je voudrais effectuer la m
normalisation colonne par colonne d'une matrice dans R. Étant donné une matrice , je veux normaliser chaque colonne en divisant chaque élément par la somme de la colonne. Une façon (hackish) de le faire est la suivante:
m / t(replicate(nrow(m), colSums(m)))
Existe-t-il un moyen plus succinct / élégant / efficace pour accomplir la même tâche?
m %*% diag(1/colSums(m))
Un autre est
prop.table(m, 2)
, ou tout simplementpropr(m)
, qui utilise en internesweep
.Il peut être intéressant de comparer les performances de ces solutions équivalentes, j'ai donc fait un petit benchmark (en utilisant le
microbenchmark
package).Voici la matrice d'entrée
m
que j'ai utilisée:Voici la configuration de référence:
Ce sont les résultats du benchmark:
Pour être complet, voici la sortie:
Sans aucun doute pour les petites matrices
m / colSums(m)[col(m)]
gagne !Mais pour les grandes matrices? Dans l'exemple suivant, j'ai utilisé une matrice 1000x1000.
Pour les grandes matrices, il
m / colSums(m)[col(m)]
fonctionne bien (4e position) mais ne gagne pas .Pour les grandes matrices
m %*% diag(1/colSums(m))
gagne !la source
propr
?la source