我正在寻找尽可能快的速度并留在基地做任何事情expand.grid
。我过去曾outer
用于类似目的来创建矢量;像这样的东西:
v <- outer(letters, LETTERS, paste0)
unlist(v[lower.tri(v)])
基准测试向我展示了它outer
可以比这要快得多,expand.grid
但是这次我想创建两列,就像expand.grid
(2个向量的所有可能组合)但是我的方法outer
这次没有用外部进行基准测试。
我希望采用 2 个向量并尽可能快地将每个可能的组合创建为两列(我认为这outer
可能是路线,但对任何基本方法都持开放态度。
这是expand.grid
方法和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)
微基准测试显示outer
速度较慢:
# 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
我认为我的outer
使用速度很慢,因为我不知道如何使用outer
来直接创建我可以do.call('rbind'
一起使用的长度为 2 的向量。我要慢paste
而慢的分裂。如何以比 更快的方式使用outer
(或 中的其他方法)执行此操作?base
expand grid
编辑:添加微基准测试结果。
**
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
**