Saya ingin melakukan normalisasi kolom-bijaksana dari matriks dalam R. Mengingat matriks m
, saya ingin menormalkan setiap kolom dengan membagi setiap elemen dengan jumlah kolom. Salah satu (peretasan) cara untuk melakukan ini adalah sebagai berikut:
m / t(replicate(nrow(m), colSums(m)))
Apakah ada cara yang lebih ringkas / elegan / efisien untuk mencapai tugas yang sama?
m %*% diag(1/colSums(m))
Lain adalah
prop.table(m, 2)
, atau hanyapropr(m)
, yang digunakan secara internalsweep
.Mungkin menarik untuk membandingkan kinerja solusi yang setara ini, jadi saya melakukan sedikit benchmark (menggunakan
microbenchmark
paket).Ini adalah matriks input yang
m
saya gunakan:Ini adalah pengaturan benchmark:
Ini adalah hasil dari patokan:
Untuk kelengkapan, ini adalah output:
Tanpa keraguan untuk kemenangan matriks kecil !
m / colSums(m)[col(m)]
Tetapi untuk matriks besar? Dalam contoh berikut saya telah menggunakan matriks 1000x1000.
Untuk matriks besar
m / colSums(m)[col(m)]
berkinerja baik (posisi ke-4) tetapi tidak menang .Untuk kemenangan matriks besar !
m %*% diag(1/colSums(m))
sumber
propr
?sumber