Ich bin auf der Suche nach so viel Geschwindigkeit wie möglich und bleiben in der Basis zu tun, was expand.grid
tut. Ich habe outer
für ähnliche Zwecke in der Vergangenheit verwendet, um einen Vektor zu erstellen; so etwas wie dieses:Verwenden Sie äußere anstelle von expand.grid
v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
Benchmarking hat mir gezeigt, dass outer
drastisch schneller als expand.grid
sein kann, aber dieses Mal möchte ich zwei Spalten erstellen, wie expand.grid
(alle möglichen Kombinationen für zwei Vektoren), aber meine Methoden mit outer
nicht Benchmark so schnell wie möglich mit dieser Zeit.
Ich hoffe, 2 Vektoren zu nehmen und jede mögliche Combo als zwei Spalten so schnell wie möglich zu schaffen (ich glaube outer
der Weg sein kann, aber ich bin weit offen für jede Basismethode.
Hier ist die expand.grid
Verfahren und . Methode outer
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)
Die microbenchmarking zeigt outer
langsamer ist:
# 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
Ich denke, meine outer
Verwendung ist langsam, weil ich nicht weiß, wie man outer
verwendet, um direkt eine Länge 2 Vektor, den ich zusammen do.call('rbind'
erstellen kann. Ich muss langsam paste
und langsam splitten. Wie kann ich dies mit outer
(oder anderen Methoden in base
) auf eine Weise tun, die schneller ist als expand grid
?
EDIT: Hinzufügen der Microbenchmark Ergebnisse.
**
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, stört es Sie, meine Methode zu der Benchmark-Liste hinzuzufügen? Es sollte in der Hälfte der Geschwindigkeit der schnellsten kommen, die Sie hier haben. – John
Ja, habe ich gerade getan. Es ist in der Tat das schnellste. –