Use outer instead of expand.grid
Solution 1:
The documentation for rep.int
isn't quite complete. It isn't just fastest in the most common case because you can pass vectors for the times argument, just like with rep
. You can use it straightforward for both sequences reducing the time another 40% or so over Tommy's.
expand.grid.jc <- function(seq1,seq2) {
cbind(Var1 = rep.int(seq1, length(seq2)),
Var2 = rep.int(seq2, rep.int(length(seq1),length(seq2))))
}
Solution 2:
Using rep.int
:
expand.grid.alt <- function(seq1,seq2) {
cbind(rep.int(seq1, length(seq2)),
c(t(matrix(rep.int(seq2, length(seq1)), nrow=length(seq2)))))
}
expand.grid.alt(seq_len(nrow(dat)), seq_len(ncol(dat)))
In my computer is like 6 times faster than expand.grid
.
Solution 3:
@ErnestA has a great solution well worthy of the answer tick!
...it could be marginally faster though:
expand.grid.alt2 <- function(seq1,seq2) {
cbind(Var1=rep.int(seq1, length(seq2)), Var2=rep(seq2, each=length(seq1)))
}
s1=seq_len(2000); s2=seq_len(2000)
system.time( for(i in 1:10) expand.grid.alt2(s1, s2) ) # 1.58
system.time( for(i in 1:10) expand.grid.alt(s1, s2) ) # 1.75
system.time( for(i in 1:10) expand.grid(s1, s2) ) # 2.46