On 25-Mar-10 21:10:17, Jeff Brown wrote: > I just had to solve this problem for myself, after not having > luck with the code posted above. I'm posting in case others > need a completely general function. > > riffle <- function (a,b) { > # Interleave a & b, starting with a, without repeating. > x <- NULL; count = 1; > for (i in 1:max(length(a), length(b))) { > if (i <= length(a)) { > x[count] <- a[i]; > count = count+1; > }; > if (i <= length(b)) { > x[count] <- b[i]; > count = count+1; > } > }; > x > }; > riffle( 1:10, 50:55 )
The following avoids the 'for' loop, though I'd like to simplify the conditionals: riffle2 <- function(x,y){ m0 <- length(x); n0 <- length(y) m <- min(m0,n0); n <- max(m0,n0) z <- numeric(m+n) if(m0==n0){ z[(-1+2*(1:m))] <- x ; z[2*(1:m)] <- y } else if(m0<n0){ z[(-1+2*(1:m))] <- x z[2*(1:m)] <- y[1:m] z[(2*m+1):(m+n)] <- y[(m+1):n] } else { z[(2*(1:m))] <- y z[-1+2*(1:m)] <- x[1:m] z[(2*m+1):(m+n)] <- x[(m+1):n] } z } riffle2((1:10),(50:55)) # [1] 1 50 2 51 3 52 4 53 5 54 6 55 7 8 9 10 riffle2((50:55),(1:10)) # [1] 50 1 51 2 52 3 53 4 54 5 55 6 7 8 9 10 riffle2((1:7),(8:14)) # [1] 1 8 2 9 3 10 4 11 5 12 6 13 7 14 Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <ted.hard...@manchester.ac.uk> Fax-to-email: +44 (0)870 094 0861 Date: 25-Mar-10 Time: 22:00:38 ------------------------------ XFMail ------------------------------ ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.