Sto cercando la massima velocità possibile e resto in base per fare ciò che fa expand.grid
. Ho usato outer
per scopi simili in passato per creare un vettore; qualcosa di simile:Usa esterno invece di expand.grid
v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
Benchmarking mi ha mostrato che outer
può essere drasticamente più veloce di expand.grid
ma questa volta voglio creare due colonne come expand.grid
(tutte le possibili combinazioni per 2 vettori) ma i miei metodi con outer
non fare punto di riferimento come veloce con esterno questa volta.
spero di prendere 2 vettori e creare ogni possibile combinazione di due colonne più velocemente possibile (credo outer
può essere il percorso, ma sono aperti a qualsiasi metodo di base.
Ecco il metodo expand.grid
e . outer
metodo
dat <- cbind(mtcars, mtcars, mtcars)
expand.grid(seq_len(nrow(dat)), seq_len(ncol(dat)))
FOO <- function(x, y) paste(x, y, sep=":")
x <- outer(seq_len(nrow(dat)), seq_len(ncol(dat)), FOO)
apply(do.call("rbind", strsplit(x, ":")), 2, as.integer)
La microbenchmarking mostra outer
è più lento:
# expr min lq median uq max
# EXPAND.G 812.743 838.6375 894.6245 927.7505 27029.54
# OUTER 5107.871 5198.3835 5329.4860 5605.2215 27559.08
Penso che il mio uso di outer
sia lento perché non so come usare outer
per creare direttamente un vettore di lunghezza 2 che io possa do.call('rbind'
insieme. Devo rallentare paste
e dividere lentamente. Come posso fare questo con outer
(o altri metodi in base
) in modo più veloce di expand grid
?
MODIFICA: Aggiunta dei risultati del microbenchmark.
**
Unit: microseconds
expr min lq median uq max
1 ERNEST 34.993 39.1920 52.255 57.854 29170.705
2 JOHN 13.997 16.3300 19.130 23.329 266.872
3 ORIGINAL 352.720 372.7815 392.377 418.738 36519.952
4 TOMMY 16.330 19.5960 23.795 27.061 6217.374
5 VINCENT 377.447 400.3090 418.505 451.864 43567.334
**
Tyler, ti dispiace aggiungere il mio metodo all'elenco dei benchmark? Dovrebbe arrivare a metà della velocità del più veloce che hai qui. – John
Sì, l'ho appena fatto. È davvero il più veloce. –