Ich möchte eine Matrix in R spaltenweise normalisieren. Bei einer gegebenen Matrix m
möchte ich jede Spalte normalisieren, indem ich jedes Element durch die Summe der Spalten dividiere. Ein (hackischer) Weg, dies zu tun, ist wie folgt:
m / t(replicate(nrow(m), colSums(m)))
Gibt es einen prägnanteren / eleganteren / effizienteren Weg, um dieselbe Aufgabe zu erfüllen?
m %*% diag(1/colSums(m))
Eine andere ist
prop.table(m, 2)
oder einfachpropr(m)
, dass intern verwendetsweep
.Es kann von Interesse sein, die Leistung dieser äquivalenten Lösungen zu vergleichen, daher habe ich einen kleinen Benchmark durchgeführt (mithilfe eines
microbenchmark
Pakets).Dies ist die Eingabematrix, die
m
ich verwendet habe:Dies ist das Benchmark-Setup:
Dies sind die Ergebnisse des Benchmarks:
Der Vollständigkeit halber ist dies die Ausgabe:
Ohne Zweifel für kleine Matrizen
m / colSums(m)[col(m)]
gewinnt !Aber für große Matrizen? Im folgenden Beispiel habe ich eine 1000x1000-Matrix verwendet.
Denn große Matrizen
m / colSums(m)[col(m)]
schneiden gut ab (4. Platz), gewinnen aber nicht .Für große Matrizen
m %*% diag(1/colSums(m))
gewinnt !quelle
propr
aus?quelle