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>

**

Antworten auf die Frage(4)

Ihre Antwort auf die Frage