Użyj outer zamiast expand.grid
Szukam jak największej prędkości i pozostania w bazie, aby robić coexpand.grid
robi. używałemouter
do podobnych celów w przeszłości, aby utworzyć wektor; coś takiego:
v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
Benchmarking mi to pokazałouter
może być znacznie szybszy niżexpand.grid
ale tym razem chcę stworzyć dwie kolumnyexpand.grid
(wszystkie możliwe kombinacje dla 2 wektorów), ale moje metody zouter
nie testuj tak szybko z zewnętrznym tym razem.
Mam nadzieję, że wezmę 2 wektory i stworzę każdą możliwą kombinację jako dwie kolumny tak szybko, jak to możliwe (myślęouter
może być trasą, ale jestem otwarty na każdą metodę bazową.
Tutaj jestexpand.grid
metoda iouter
metoda.
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)
Pokazują mikrobenografyouter
jest wolniejszy:
# 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
Myślę, że mójouter
użycie jest powolne, ponieważ nie wiem, jak używaćouter
aby bezpośrednio utworzyć wektor długości 2, który mogędo.call('rbind'
razem. Muszę zwolnićpaste
i powolny podział. Jak mogę to zrobićouter
(lub inne metody wbase
) w sposób szybszy niżexpand grid
?
EDYTUJ: Dodawanie wyników mikroznaków.
**
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
**