rmatrixrowsequencerep

Repeat specific rows a given number of times in R


I have the matrix

x=matrix(c(1,1,2,2,10,10,20,20,21,21,30,30,31,31,40,40,
           101,103,102,103,111,112,120,121,120,121,130,131,130,131,140,141),16,2)

I want to repeat each two rows of x a given number of times, that is based on y=c(2,2,2,1,1,1,1,1).

I mean that the first two rows of x are repeated two times (y[1] is equal to 2), the next two rows of x are repeated two times (y[2] is equal to 2), and so on. The last two rows of x are repeated once since (y[8] is equal to 1) is equal to one.

I have tried with rep but it repeats each row, but not every two rows.

I do not want to use any package, just base. Also, I want to avoid any for loop.


Solution

  • x=matrix(c(1,1,2,2,10,10,20,20,21,21,30,30,31,31,40,40,
               101,103,102,103,111,112,120,121,120,121,130,131,130,131,140,141),16,2)
    
    
    s <- rep(seq_len(8),  c(2,2,2,1,1,1,1,1))
    
    x[as.vector(rbind(s*2 -1, s*2)),]
    
    ##>
    ##>      [,1] [,2]
    ##> [1,]    1  101
    ##> [2,]    1  103
    ##> [3,]    1  101
    ##> [4,]    1  103
    ##> [5,]    2  102
    ##> [6,]    2  103
    ##> [7,]    2  102
    ##> [8,]    2  103
    ##> [9,]   10  111
    ##>[10,]   10  112
    ##>[11,]   10  111
    ##>[12,]   10  112
    ##>[13,]   20  120
    ##>[14,]   20  121
    ##>[15,]   21  120
    ##>[16,]   21  121
    ##>[17,]   30  130
    ##>[18,]   30  131
    ##>[19,]   31  130
    ##>[20,]   31  131
    ##>[21,]   40  140
    ##>[22,]   40  141