Используйте внешний вместо expand.grid

Я ищу как можно большую скорость и остаюсь на базе, чтобы делать то, чтоexpand.grid делает. я использовалouter для аналогичных целей в прошлом создавался вектор; что-то вроде этого:

<code>v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
</code>

Бенчмаркинг показал мне, чтоouter может быть значительно быстрее, чемexpand.grid но на этот раз я хочу создать две колонки, какexpand.grid (все возможные комбинации для 2 векторов), но мои методы сouter на этот раз не сравнивайте так быстро с внешним.

Я надеюсь взять 2 вектора и создать максимально возможную комбинацию из двух столбцов (думаю,outer может быть маршрут, но я широко открыт для любого базового метода.

Здесьexpand.grid метод иouter метод.

<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>

Микробенчмаркинг-шоуouter медленнее:

<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>

Я думаю мойouter использование медленное, потому что я не знаю, как использоватьouter напрямую создать вектор длины 2, который я могуdo.call('rbind' все вместе. Я должен замедлитьpaste и медленный сплит. Как я могу сделать это сouter (или другие методы вbase) таким образом, что это быстрее, чемexpand grid?

EDIT: Adding the microbenchmark results.

**

<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>

**

enter image description here

Ответы на вопрос(4)

Ваш ответ на вопрос