Используйте внешний вместо 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>
**