Chciałbym przeprowadzić kolumnową normalizację macierzy w R. Biorąc pod uwagę macierz m
, chcę znormalizować każdą kolumnę dzieląc każdy element przez sumę kolumny. Jeden (hackish) sposób, aby to zrobić, jest następujący:
m / t(replicate(nrow(m), colSums(m)))
Czy istnieje bardziej zwięzły / elegancki / skuteczny sposób na osiągnięcie tego samego zadania?
m %*% diag(1/colSums(m))
Innym jest
prop.table(m, 2)
, lub po prostupropr(m)
, wewnętrznysweep
.Może być interesujące porównanie wydajności tych równoważnych rozwiązań, więc zrobiłem mały test porównawczy (używając
microbenchmark
pakietu).Oto matryca wejściowa,
m
której użyłem:Oto konfiguracja testu porównawczego:
Oto wyniki testu porównawczego:
Dla kompletności jest to wynik:
Bez wątpienia wygrywa mała matryca !
m / colSums(m)[col(m)]
Ale dla dużych matryc? W kolejnym przykładzie użyłem matrycy 1000 x 1000.
Dla dużych matryc
m / colSums(m)[col(m)]
działa dobrze (4. pozycja), ale nie wygrywa .Dla dużych matryc
m %*% diag(1/colSums(m))
wygrywa !źródło
propr
z?źródło