Estoy buscando la mayor velocidad posible y permanecer en la base para hacer lo que hace expand.grid
. He usado outer
para propósitos similares en el pasado para crear un vector; algo como esto:Use outer en lugar de expand.grid
v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
Benchmarking me ha demostrado que outer
puede ser drásticamente más rápido que expand.grid
pero esta vez quiero crear dos columnas al igual que expand.grid
(todos los combos posibles para 2 vectores) pero mis métodos con outer
no hacer punto de referencia tan rápido con exterior esta vez.
Estoy esperando para tomar 2 vectores y crear cada posible combinación como dos columnas lo más rápido posible (creo outer
puede ser la ruta, pero estoy abierta a cualquier método de base.
Aquí está el método expand.grid
y . outer
método
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)
El microbenchmarking muestra outer
es más 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
Creo que mi uso de outer
es lento porque no sé cómo usar outer
para crear directamente un vector de longitud 2 que puedo do.call('rbind'
juntos. Tengo que ralentizar paste
y ralentizar la división. ¿Cómo puedo hacer esto con outer
(u otros métodos en base
) de una manera que sea más rápida que expand grid
?
EDITAR: Agregando los resultados de 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, ¿te importaría agregar mi método a la lista de referencia? Debería venir a la mitad de la velocidad más rápida que tienes aquí. – John
Sí, acabo de hacer. De hecho, es el más rápido. –