Me gustaría realizar una normalización en columna de una matriz en R. Dada una matriz m, quiero normalizar cada columna dividiendo cada elemento por la suma de la columna. Una forma (hack) de hacer esto es la siguiente:
m / t(replicate(nrow(m), colSums(m)))
¿Existe una forma más sucinta / elegante / eficiente de lograr la misma tarea?

m %*% diag(1/colSums(m))Otro es
prop.table(m, 2), o simplementepropr(m), que usa internamentesweep.Puede ser interesante comparar el rendimiento de estas soluciones equivalentes, así que hice un pequeño punto de referencia (usando el
microbenchmarkpaquete).Esta es la matriz de entrada
mque he usado:Esta es la configuración de referencia:
Estos son los resultados del punto de referencia:
Para completar, este es el resultado:
¡Sin dudas para pequeñas matrices
m / colSums(m)[col(m)]gana !¿Pero para grandes matrices? En el siguiente ejemplo, he usado una matriz de 1000x1000.
Para matrices grandes
m / colSums(m)[col(m)]funciona bien (cuarta posición) pero no gana .¡Para grandes matrices
m %*% diag(1/colSums(m))gana !fuente
proprde?fuente