[R] rbind for matrices - rep argument

(Ted Harding) Ted.Harding at manchester.ac.uk
Wed Jan 7 19:08:19 CET 2009


On 07-Jan-09 15:22:57, Niccolò Bassani wrote:
> Dear R users,I'm facing a trivial problem, but I really can't solve it.
> I've tried a dozen of codes, but I can't get the result I want.
> The question is: I have a dataframe like this one
> 
> [,1] [,2] [,3] [,4] [,5]
> [1,]    1    2    3    4    5
> [2,]    2    5    5    4    9
> [3,]    1    6    8    1    2
> [4,]    8    6    4    1    5
> 
> made up of decimal numbers, of course.
> I want to append this dataframe to itself a number x of times, i.e. 3.
> That is I want a dataframe like this
> 
> [,1] [,2] [,3] [,4] [,5]
> [1,]    1    2    3    4    5
> [2,]    2    5    5    4    9
> [3,]    1    6    8    1    2
> [4,]    8    6    4    1    5
> [5,]    1    2    3    4    5
> [6,]    2    5    5    4    9
> [7,]    1    6    8    1    2
> [8,]    8    6    4    1    5
> [9,]    1    2    3    4    5
> [10,]    2    5    5    4    9
> [11,]    1    6    8    1    2
> [12,]    8    6    4    1    5
> 
> I'm searching for an "authomatic" way to do this (I've already used the
> rbind re-writing x times the name of the frame...), as it must enter a
> function where one argument is exactly the number x of times to repeat
> this frame.
> 
> Any ideas??
> Thanks in advance!
> Niccolò

I don't know whether there is anywhere a ready-made function which
will implement a "rep" paramater for an rbind, but the following ad-hoc
function will do it for you efficiently (i.e. with the minimum number
of applications of the rbind() function).

To produce a result which consists of k replicates of x, row-bound:


  Krbind <- function(x,k){
    y <- x
    if(k==1) return(x)
    p <- floor(log2(k))
    for(i in (1:p)){
      z <- rbind(y,y)
      y <- z
    }
    k <- (k - 2^p)
    if(k==0) return(y) else return(rbind(y,Krbind(x,k)))
  }

## Example:

  Xdf <- data.frame(X1=c(1.1,1.2),X2=c(2.1,2.2),
                    X3=c(3.1,3.2),X4=c(4.1,4.2))

  Krbind(Xdf,6)
#     X1  X2  X3  X4
# 1  1.1 2.1 3.1 4.1
# 2  1.2 2.2 3.2 4.2
# 3  1.1 2.1 3.1 4.1
# 4  1.2 2.2 3.2 4.2
# 5  1.1 2.1 3.1 4.1
# 6  1.2 2.2 3.2 4.2
# 7  1.1 2.1 3.1 4.1
# 8  1.2 2.2 3.2 4.2
# 9  1.1 2.1 3.1 4.1
# 10 1.2 2.2 3.2 4.2
# 11 1.1 2.1 3.1 4.1
# 12 1.2 2.2 3.2 4.2

Of course, if you're not worried by efficiency, then the simple loop

  y <- x
  for(i in (1:(k-1))){y <- rbind(y,x)}

will do it!

Hoping this helps,
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 07-Jan-09                                       Time: 18:08:14
------------------------------ XFMail ------------------------------




More information about the R-help mailing list