Verwenden Sie "Outer" anstelle von "expand.grid"
Ich suche so viel Geschwindigkeit wie möglich und bleibe in der Basis, um was zu tunexpand.grid
tut. Ich habe benutztouter
für ähnliche Zwecke in der Vergangenheit einen Vektor zu erstellen; etwas wie das:
<code>v <- outer(letters, LETTERS, paste0) unlist(v[lower.tri(v)]) </code>
Benchmarking hat mir das gezeigtouter
kann drastisch schneller sein alsexpand.grid
diesmal möchte ich aber gleich zwei spalten erstellenexpand.grid
(alle möglichen kombos für 2 vektoren) aber meine methoden mitouter
Vergleiche diesmal nicht so schnell mit Outer.
Ich hoffe, dass ich 2 Vektoren nehmen und jede mögliche Kombination so schnell wie möglich in zwei Spalten erstellen kann (glaube ich)outer
kann die Route sein, bin aber weit offen für jede Basismethode.
Hier ist dieexpand.grid
Methode undouter
Methode.
<code>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) </code>
Das Microbenchmarking zeigtouter
ist langsamer:
<code># 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 </code>
Ich denke meinouter
Verwendung ist langsam, weil ich nicht weiß, wie man verwendetouter
um direkt einen Vektor der Länge 2 zu erstellen, den ich kanndo.call('rbind'
zusammen. Ich muss langsamer werdenpaste
und langsame Trennung. Wie kann ich das machen mitouter
(oder andere Methoden inbase
) in einer Weise, die schneller ist alsexpand grid
?
EDIT: Hinzufügen der Mikrobenchmark-Ergebnisse.
**
<code>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 </code>
**