Gostaria de executar a normalização em coluna de uma matriz em R. Dada uma matriz m
, quero normalizar cada coluna dividindo cada elemento pela soma da coluna. Uma maneira (hackeada) de fazer isso é a seguinte:
m / t(replicate(nrow(m), colSums(m)))
Existe uma maneira mais sucinta / elegante / eficiente de realizar a mesma tarefa?
m %*% diag(1/colSums(m))
Outra é
prop.table(m, 2)
, ou simplesmentepropr(m)
, que usa internamentesweep
.Pode ser interessante comparar o desempenho dessas soluções equivalentes, então fiz um pequeno benchmark (usando o
microbenchmark
pacote).Esta é a matriz de entrada
m
que eu usei:Esta é a configuração de benchmark:
Estes são os resultados do benchmark:
Para completar, esta é a saída:
Sem dúvida para pequenas matrizes
m / colSums(m)[col(m)]
ganha !Mas para grandes matrizes? No exemplo subsequente, usei uma matriz 1000x1000.
Para matrizes grandes, o
m / colSums(m)[col(m)]
desempenho é bom (4ª posição), mas não vence .Para grandes matrizes
m %*% diag(1/colSums(m))
ganha !fonte
propr
?fonte