Il pacchetto grr
contiene un metodo di ordinamento alternativo che può essere utilizzato per velocizzare questa particolare operazione (ho ridotto la dimensione della matrice leggermente in modo che questo riferimento non tiene sempre):
> set.seed(1)
> a <- matrix(runif(9e+06),ncol=300)
> microbenchmark::microbenchmark(sorted <- t(apply(a,1,sort))
+ ,sorted2 <- t(apply(a,1,sort.int, method='quick'))
+ ,sorted3 <- t(apply(a,1,grr::sort2)),times=3,unit='s')
Unit: seconds
expr min lq mean median uq max neval
sorted <- t(apply(a, 1, sort)) 1.7699799 1.865829 1.961853 1.961678 2.057790 2.153902 3
sorted2 <- t(apply(a, 1, sort.int, method = "quick")) 1.6162934 1.619922 1.694914 1.623551 1.734224 1.844898 3
sorted3 <- t(apply(a, 1, grr::sort2)) 0.9316073 1.003978 1.050569 1.076348 1.110049 1.143750 3
la differenza diventa drammatica quando la matrice contiene caratteri:
> set.seed(1)
> a <- matrix(sample(letters,size = 9e6,replace = TRUE),ncol=300)
> microbenchmark::microbenchmark(sorted <- t(apply(a,1,sort))
+ ,sorted2 <- t(apply(a,1,sort.int, method='quick'))
+ ,sorted3 <- t(apply(a,1,grr::sort2)),times=3)
Unit: seconds
expr min lq mean median uq max neval
sorted <- t(apply(a, 1, sort)) 15.436045 15.479742 15.552009 15.523440 15.609991 15.69654 3
sorted2 <- t(apply(a, 1, sort.int, method = "quick")) 15.099618 15.340577 15.447823 15.581536 15.621925 15.66231 3
sorted3 <- t(apply(a, 1, grr::sort2)) 1.728663 1.733756 1.780737 1.738848 1.806774 1.87470 3
I risultati sono identici per tutti e tre.
> identical(sorted,sorted2,sorted3)
[1] TRUE
Speravo ci potesse essere un modo per evitare l'operazione di trasposizione, che sospetto acceleri le cose. – Zach
Bene, il ciclo for evita la trasposizione, ma non * dove * è trascorso il tempo. – Tommy
@Zach - Ho aggiornato la mia risposta con una soluzione parallela, forse funziona per voi se avete molta RAM ... – Tommy