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
microbenchmark
paquete).Esta es la matriz de entrada
m
que 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
propr
de?fuente